pandas - 通过对 Pandas 中的某些列求和来组合多个数据框
问题描述
给定三个数据框:
df1 = pd.DataFrame({'A': [5, 0], 'B': [2, 4], 'C': 'dog'})
df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3], 'C': 'dog'})
df3 = pd.DataFrame({'A': [2, 1], 'B': [5, 1], 'C': 'dog'})
如何通过添加给定数据帧的子集的值将它们组合成一个数据帧,使得结果变为:
pd.DataFrame({'A': [8, 2], 'B': [10, 8], 'C': 'dog'})
这个例子?我的问题是我也有相同的列,但不能相加(如'C'
这里)。
解决方案
一种可能的解决方案是使用sum
if 数值和 if 字符串,然后在s列表GroupBy.agg
之后加入每个组的唯一值:concat
DataFrame
f = lambda x: x.sum() if np.issubdtype(x.dtype, np.number) else ','.join(x.unique())
df = pd.concat([df1, df2, df3], keys=range(3)).groupby(level=1).agg(f)
print (df)
A B C
0 8 10 dog
1 2 8 dog
如果可能的话,不同的值,如cat
和dog
:
df1 = pd.DataFrame({'A': [5, 0], 'B': [2, 4], 'C': 'dog'})
df2 = pd.DataFrame({'A': [1, 1], 'B': [3, 3], 'C': 'dog'})
df3 = pd.DataFrame({'A': [2, 1], 'B': [5, 1], 'C': ['cat','dog']})
f = lambda x: x.sum() if np.issubdtype(x.dtype, np.number) else ','.join(x.unique())
df = pd.concat([df1, df2, df3], keys=range(3)).groupby(level=1).agg(f)
print (df)
A B C
0 8 10 dog,cat
1 2 8 dog
如果需要清单:
f = lambda x: x.sum() if np.issubdtype(x.dtype, np.number) else x.unique().tolist()
df = pd.concat([df1, df2, df3], keys=range(3)).groupby(level=1).agg(f)
print (df)
A B C
0 8 10 [dog, cat]
1 2 8 [dog]
对于带有非数字值的标量的组合列表,请使用自定义函数:
def f(x):
if np.issubdtype(x.dtype, np.number):
return x.sum()
else:
u = x.unique().tolist()
if len(u) == 1:
return u[0]
else:
return u
df = pd.concat([df1, df2, df3], keys=range(3)).groupby(level=1).agg(f)
print (df)
A B C
0 8 10 [dog, cat]
1 2 8 dog
推荐阅读
- apache-spark - 如何在 Zeppelin 中将数据帧转换为 rdd 以使用 graphX
- google-app-engine - 将 Jenkins 与 Google Cloud Build 集成
- extjs - 在 Extjs 中获取音频和发音 word - word to Speech
- django - 如何使用 django rest swagger 在删除操作中显示序列化程序
- java - 我应该在请求中处理意外的 json 字段吗?
- reactjs - 是否可以使用 Graph Toolkit 2.0 在 Microsoft Teams 选项卡中进行静默身份验证
- ansible - Ansible 从变量列表创建目录
- android - 材料文本输入样式与阿拉伯语有问题
- android - Android studio - gradle 4.1.1 - minsdk 23:在 android 设备 6.0.1 上使用“vectorDrawables.useSupportLibrary”时出现异常
- c# - Hangfire 重复作业下一次执行时间为空