簡體   English   中英

組合多個 pandas DataFrames

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

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