当索引相同时,DataFrame 连接不同的列值
DataFrame concat different column values when index are the same
我正在使用 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
但我真正想要的结果是像下面的格式,它基于索引内容,如果索引内容相同,该值将被放入每一列下的同一行,而不是开始一个新行并填充in 与 NaN,即示例中的索引 'SS_1'。如果index是唯一的,某列下没有数据,那么填'NaN'即可,即index 'SS_0'/col 'Tx-TCP'.
Tx-TCP Tx-UDP
SS_0 NaN 1.11
SS_1 3.33 2.22
尝试过 concat/merge/join/grouby 等,但还没有找到方法。
请大家帮忙指教,万分感谢!
这个怎么样:
pd.concat([df_0,df_1.join(df_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
选项 1
您想迭代应用数据框方法 pd.DataFrame.combine_first
using reduce
from 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
这是我的附加代码,用于修复您的代码
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
我正在使用 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
但我真正想要的结果是像下面的格式,它基于索引内容,如果索引内容相同,该值将被放入每一列下的同一行,而不是开始一个新行并填充in 与 NaN,即示例中的索引 'SS_1'。如果index是唯一的,某列下没有数据,那么填'NaN'即可,即index 'SS_0'/col 'Tx-TCP'.
Tx-TCP Tx-UDP
SS_0 NaN 1.11
SS_1 3.33 2.22
尝试过 concat/merge/join/grouby 等,但还没有找到方法。 请大家帮忙指教,万分感谢!
这个怎么样:
pd.concat([df_0,df_1.join(df_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
选项 1
您想迭代应用数据框方法 pd.DataFrame.combine_first
using reduce
from 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
这是我的附加代码,用于修复您的代码
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