当index相同时,DataFrame会连接不同的列值

时间:2017-08-17 19:21:12

标签: python pandas dataframe group-by pandas-groupby

我正在使用Python将多个DataFrames(DF)连接成一个DF,之后连接一些样本DF,如下所示:

import pandas as pd

df_list = []

df_0 = pd.DataFrame('1.11', index=['SS_0'], columns=['Tx-UDP'])
df_1 = pd.DataFrame('2.22', index=['SS_1'], columns=['Tx-UDP'])
df_2 = pd.DataFrame('3.33', index=['SS_1'], columns=['Tx-TCP'])

df_list.append(df_0)
df_list.append(df_1)
df_list.append(df_2)

df_final = pd.concat(df_list) # type: pd.DataFrame

print(df_final)

我得到的结果打印为:

     Tx-TCP Tx-UDP
SS_0    NaN   1.11
SS_1    NaN   2.22
SS_1   3.33    NaN

但我真正想要的结果就像下面的格式,它基于索引内容,如果索引内容相同,则值将被放入每列下的同一行,而不是开始一个新行并填写NaN,即索引' SS_1'在例子中。如果索引是唯一的,并且某些列下没有数据,那么请填写“NaN'很好,即索引' SS_0' / col' Tx-TCP'。

     Tx-TCP Tx-UDP
SS_0    NaN   1.11
SS_1   3.33   2.22

尝试使用concat / merge / join / grouby等,但还没有找到办法。 请提前提醒并多多提供建议!

4 个答案:

答案 0 :(得分:7)

选项1
您希望使用pd.DataFrame.combine_first

中的reduce来迭代应用数据框方法functools
from functools import reduce

reduce(pd.DataFrame.combine_first, df_list)

      Tx-TCP Tx-UDP
SS_0     NaN   1.11
SS_1    3.33   2.22

选项2
我的pd.concat解决方案版本

pd.concat(df_list).groupby(level=0).first()

     Tx-TCP Tx-UDP
SS_0    NaN   1.11
SS_1   3.33   2.22

或者

pd.concat(df_list).groupby(level=0).last()

     Tx-TCP Tx-UDP
SS_0    NaN   1.11
SS_1   3.33   2.22

实验A
玩耍

from functools import reduce

idx = reduce(pd.Index.union, [d.index for d in df_list])
col = reduce(pd.Index.union, [d.columns for d in df_list])
tmp = pd.DataFrame(index=idx, columns=col)
reduce(pd.DataFrame.fillna, [tmp] + df_list)

     Tx-TCP Tx-UDP
SS_0    NaN   1.11
SS_1   3.33   2.22

实验B
玩耍

from functools import reduce

idx = reduce(pd.Index.union, [d.index for d in df_list])
col = reduce(pd.Index.union, [d.columns for d in df_list])
tmp = pd.DataFrame(index=idx, columns=col)
[tmp.update(d) for d in df_list];
tmp

     Tx-TCP Tx-UDP
SS_0    NaN   1.11
SS_1   3.33   2.22

答案 1 :(得分:2)

一种方法是在轴1上连接数据帧并使用groupby

合并列
pd.concat([df_0, df_1,df_2], axis = 1).groupby(level = 0, axis = 1).first()


        Tx-TCP  Tx-UDP
SS_0    NaN     1.11
SS_1    3.33    2.22

答案 2 :(得分:1)

这是我修复代码的附加代码

df=df.groupby(level=0).bfill()

df.reset_index().drop_duplicates(subset='index', keep='first').set_index('index')

Out[1076]: 
       Tx-TCP  Tx-UDP
index                
SS_0      NaN    1.11
SS_1     3.33    2.22

答案 3 :(得分:0)

怎么样:

pd.concat([df_0,df_1.join(df_2)])