簡體   English   中英

如何添加像 Matrices Python/Pandas 這樣的 DataFrame?

[英]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_dtypespd.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM