[英]combine multiple pandas DataFrames
我有多个具有相同格式的 DataFrame。 我想创建一个结合以前的 dataframe 。 结果 dataframe 的每一行都是先前数据帧之一的行,其中某一列是最大值,
例子
data1 :
Name Age
0 michael 18
1 lincoln 20
2 theodore 84
3 alexandre 95
data2 :
Name Age
0 sayed 17
1 hurley 29
2 sawyer 44
3 John 15
data3 :
Name Age
0 walter 50
1 jesse 15
2 fring 20
3 saul 34
预期的结果是:
Results :
Name Age
0 walter 50
1 hurley 29
2 theodore 84
3 alexandre 95
我有超过 500.000 行和 51 列我正在寻找比解析所有数据更快的东西(O(n2) 的复杂性是如此之大)
谢谢你。
您可以使用np.where
选择数据框列之间的最大值。 然后将此应用于 dataframe 的所有列。 最后使用reduce()
应用于所有数据帧。
import functools
columns = df_.columns
df_ = pd.DataFrame(columns=columns)
def choose_larger(df1, df2):
m = df1['Age'] > df2['Age']
for col in columns:
df_[col] = np.where(m, df1[col], df2[col])
return df_
# Another possible function
def choose_larger2(df1, df2):
m = df1['Age'] > df2['Age']
m = pd.concat([m]*len(columns), axis=1)
return pd.DataFrame(np.where(m, df1, df2), columns=columns)
df_max = functools.reduce(lambda df1, df2: choose_larger(df1, df2), [data1, data2, data3])
print(df_max)
Name Age
0 michael 18
1 lincoln 20
2 theodore 84
3 alexandre 95
如果您水平堆叠数据框:
dfs = [df.add_suffix(index) for index, df in enumerate([data1, data2, data3])]
df = pd.concat(dfs, axis=1)
您可以使用idxmax()
查找每行最大Age
的列indexes
:
indexes = df.filter(like='Age').idxmax(axis=1)
然后indexes
将给出每个 max Age
并且shift()
将给出每个对应的Name
:
pd.DataFrame({'Name': np.diag(df.shift(axis=1)[indexes]), 'Age': np.diag(df[indexes])})
# Name Age
# 0 walter 50
# 1 hurley 29
# 2 theodore 84
# 3 alexandre 95
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.