python - 当索引相同时,DataFrame 连接不同的列值

标签 python pandas dataframe group-by pandas-groupby

我正在使用 Python 将多个数据帧 (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'/列'Tx-TCP'。

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

尝试使用 concat/merge/join/grouby 等,但还没有找到方法。 请帮忙提供建议,非常感谢!

最佳答案

选项 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

关于python - 当索引相同时,DataFrame 连接不同的列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45743415/

相关文章:

python - 由 Xarray 中的一系列坐标定义的多边形的 3D 掩模

python - Urllib Python 没有提供我在检查元素中看到的 html 代码

python - 为什么 pandas reindex() 不就地运行?

python - 关联表的列到行

r - 如何过滤具有多个条件的数据框?

python - 用另一个 df 中的行替换 Pandas df 中的行

python - 值错误: invalid literal for int() with base 10: 'MSIE'

python - TensorFlow错误: funcsigs module doesn't have signature attribute

python - 根据其他三列的多数值设置 pandas 数据框获胜者列值

Pandas - 根据后一列中是否存在值来过滤一列中具有相同值和另一列中具有多个值的行