看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在数据形式转换过程中,我们要充分利用pandas的apply()等应用函数方式来写出需求需要的逻辑,在本例中,我们就来完成这样一个需求。
源数据代码如下:
import pandas as pd
from io import StringIO
data = '''
编号,金额
A,2
B,5
C,3
'''
df = pd.read_csv(StringIO(data))
df
'''
编号 金额
0 A 2
1 B 5
2 C 3
'''
需求为在原数据右边增加列名为编号的若干列,如上数据的A、B、C三列,列值的计算方法为编号对应的金额减去列名在原编号列对应差的的绝对值。
效果如:
'''
编号 金额 A B C
0 A 2 0 3 1
1 B 5 3 0 2
2 C 3 1 2 0
'''
首先要根据逻辑生成一个新的DataFrame,然后与原DataFrame合并。
根据需求逻辑描述,让金额列Series每个值来应用一个我们写的函数,这个函数就是需求中的计算,计算得到一个Series,有几个金额值就得到几个Series,最终返回一个DataFrame。
还需要将这个新生成的DataFrame的列名修改为编号的值。
金额列应用我们写的函数,函数由于特别简单,我们用lambda表达式:
df.金额.apply(lambda x: (x-df.金额).abs())
'''
0 1 2
0 0 3 1
1 3 0 2
2 1 2 0
'''
修改列表名编号列的值:
new_df = (
df.金额
.apply(lambda x: (x-df.金额).abs())
.rename(df.编号, axis=1)
)
new_df
'''
A B C
0 0 3 1
1 3 0 2
2 1 2 0
'''
将新生成的DataFrame与原DataFrame合并:
pd.concat([df, new_df], axis=1)
'''
编号 金额 A B C
0 A 2 0 3 1
1 B 5 3 0 2
2 C 3 1 2 0
'''
合并也可以用merge()方法:
df.merge(new_df, left_index=True, right_index=True)
# ...
这样,就完成了需求。
(完)
更新时间:Aug. 18, 2024, 4:07 p.m. 标签:pandas python 函数 计算