![](/img/trans.png)
[英]How can I add "sub" dataframes or subrows in Pandas Python with different operation per row and per object?
[英]How can I add DataFrames like Matrices Python/Pandas?
我有一個很長的數據框列表(有很多列......),如下所示:
DF1
nameOne total_one total_two nameTwo nameThree ...
0 nn1 2 3 nn4 nn7
1 nn2 2 3 nn5 nn8
2 nn3 2 3 nn6 nn9
DF2
nameOne total_one total_two nameTwo nameThree. ....
0 nn1 4 6 nn4 nn7
1 nn2 4 6 nn5 nn8
2 nn3 4 6 nn6 nn9
我希望結果看起來像:
RESULT_DF
nameOne total_one total_two nameTwo nameThree. ....
0 nn1 6 9 nn4 nn7
1 nn2 6 9 nn5 nn8
2 nn3 6 9 nn6 nn9
換句話說,我只想添加數字列。
我試過這樣做: DF1.add(DF2, fill_value=0)
但我收到此錯誤: TypeError: +: 'int' and 'str' unsupported operand type(s)
為簡潔起見,這里我只展示了一個 Str 列。 但是我有更多的 STR 列,以及更多的 int/float 列。
說明:請注意,這與THIS問題不同,因為我提到我有多個字符串字段。
您可以嘗試使用select_dtypes
和pd.concat
:
pd.concat([df1.select_dtypes(include='number').add(df2.select_dtypes(include='number')),
df1.select_dtypes(exclude='number'),
df2.select_dtypes(exclude='number')], axis=1)
Output:
total_one total_two nameOne nameOne
0 6 9 nn1 nn1
1 6 9 nn2 nn2
2 6 9 nn3 nn3
df3 = df1.copy()
df4 = df2.copy()
lofdfs = [df1, df2, df3, df4]
from functools import reduce
df_add = reduce(lambda x,y: x.select_dtypes(include='number').add(y.select_dtypes('number')), lofdfs)
pd.concat([i.select_dtypes(exclude='number') for i in lofdfs]+[df_add], axis=1, keys=['df1','df2','df3','df4','df_add'])
Output:
df1 df2 df3 df4 df_add
nameOne nameOne nameOne nameOne total_one total_two
0 nn1 nn1 nn1 nn1 12 18
1 nn2 nn2 nn2 nn2 12 18
2 nn3 nn3 nn3 nn3 12 18
將總數移到前面:
df_add = reduce(lambda x,y: x.select_dtypes(include='number').add(y.select_dtypes('number')), lofdfs)
print(pd.concat([df_add]+[i.select_dtypes(exclude='number') for i in lofdfs], axis=1, keys=['df1','df2','df3','df4','df_add']))
Output:
df1 df2 df3 df4 df_add
total_one total_two nameOne nameOne nameOne nameOne
0 12 18 nn1 nn1 nn1 nn1
1 12 18 nn2 nn2 nn2 nn2
2 12 18 nn3 nn3 nn3 nn3
另一種方法是使用df.filter
過濾掉DF2
的數字列。 將它們添加到DF1
。 什么結果是 str 的數字列和 NaN 的聚合結果。 Chain combine_first
這會更新 NaNS
選項1; 2個數據框
如果只有兩個數據框
RESULT_DF=(DF2.filter(like='total').add(DF1)).combine_first(DF1)
RESULT_DF
nameOne nameThree nameTwo total_one total_two
0 nn1 nn7 nn4 6 9
1 nn2 nn8 nn5 6 9
2 nn3 nn9 nn6 6 9
Option2 數據幀列表
如果您有清單; select 非數字 dtypes 並在使用來自 functools 的 reduce 后加入求和
DF3 = DF2.copy()
DF4 = DF1.copy()
LST=[DF1,DF2,DF3]
from functools import reduce
df = DF1.select_dtypes(exclude='int64').join(reduce(lambda x, y:\
(x.filter(like='total')).add(y.filter(like='total'), fill_value=0), LST))
print(df)
nameOne nameTwo nameThree total_one total_two
0 nn1 nn4 nn7 10 15
1 nn2 nn5 nn8 10 15
2 nn3 nn6 nn9 10 15
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.