Объедините кадры данных Pandas, чтобы создать список для повторяющихся совпадений - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть два кадра данных:

df1 = pd.DataFrame([['ida', 1], ['idb', 2], ['idc', 3]], columns=['A','B'])
df2 = pd.DataFrame([['idb', 20], ['ida', 10], ['idb', 21], ['idb', 22]], columns=['A', 'C'])

, и я хотел бы добавить данные из df2 в df1 в список :

df3 = 
  |A   B  C
---------------
0 |ida 1  [10]
1 |idb 2  [20, 21, 22]
2 |idc 3  NaN

Я могу объединить оба кадра:

df1.merge(df2, how='left')
     A  B     C
0  ida  1  10.0
1  idb  2  20.0
2  idb  2  21.0
3  idb  2  22.0
4  idc  3   NaN

Но тогда как мне «объединить» совпадающие строки?Кроме того, на самом деле df2 намного больше, и я хочу скопировать только столбцы «C», а не столбцы «D», «E», «F» ...

В качестве альтернативы, я могу создать новыйстолбец в df1, а затем итерируйте по df2, чтобы заполнить его:

for n, row in df2.iterrows():
    idx = df1.index[row['A'] == df1['A']]
    for i in idx:  # hopefully only 1 or 0 values in idx
        <assign value> df1.at[i, 'A'] = ???

Причина, по которой я хочу получить списки, состоит в том, что существует гибкое количество значений 'C', и позже я хочу вычислить среднее значение,стандартное отклонение, ...

Правка: опечатка

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Это прекрасный пример merging и после этого groupby с применением функции list, как показано ниже:

# Merge on key columns A
df3 = pd.merge(df1, df2, on='A', how='outer')

# Output1
    A   B   C
0   ida 1   10.0
1   idb 2   20.0
2   idb 2   21.0
3   idb 2   22.0
4   idc 3   NaN

# Groupby and apply list to keep values
df_final = df3.groupby('A').C.apply(list).reset_index()


    A   C
0   ida [10.0]
1   idb [20.0, 21.0, 22.0]
2   idc [nan]

РЕДАКТИРОВАТЬ:

Если вы хотитеПриносить только определенные столбцы после слияния вы можете следующим образом:
df3 = pd.merge(df1, df2[['A', 'C']], on='A', how='outer')

0 голосов
/ 27 февраля 2019

С версией 0.24.x и выше панд вы можете использовать:

import numpy as np
import pandas as pd

df3 = (df1.merge(
            df2.groupby('A')['C'].apply(np.array),
            how='left',
            left_on='A',
            right_index=True))

А для вашей сводной статистики:

df3['C'].apply(lambda x: np.std(x))
df3['C'].apply(lambda x: np.mean(x))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...