Среднее из данных - PullRequest
       1

Среднее из данных

0 голосов
/ 05 января 2019

Предположим, у меня есть три кадра данных с одинаковым индексом и одинаковыми именами столбцов (некоторые столбцы являются строками, другие числовыми): df1, df2, df3.

df1

Hour | X1 | X2 | X3 | X4
 0   | 10 | H | 2   | -1  
 1   | 10 | b | 1   | 0 
 2   | 10 | D | 1   | 0 
 3   | 20 | L | 1   | 0

df2

Hour | X1 | X2 | X3 | X4
 0   | 10 | H | 1   | 1  
 1   | 10 | b | 1   | 0 
 2   | 10 | D | 1   | 0 
 3   | 20 | L | 2   | 0

DF3

Hour | X1 | X2 | X3 | X4
 0   | 10 | H  | 0  |  0  
 1   | 10 | b  | 0  |  0 
 2   | 10 | D  | 0  |  0 
 3   | 20 | L  | 0  |  30

Мне нужен новый фрейм данных, представляющий собой среднее значение этих фреймов данных для числовых значений, но оставив строковый столбец без изменений (все строковые столбцы одинаковы).

df4 =

Hour | X1 | X2 | X3 | X4
 0   | 10 | H | 1 | 0  
 1   | 10 | b | 1 | 0 
 2   | 10 | D | 1 | 0 
 3   | 20 | L | 1 | 10

Я предпочитаю делать это, используя функцию добавления, так как мне нужно написать цикл for для доступа к каждому фрейму данных. Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Вы можете использовать select_dtypes для разделения числовых и нечисловых серий. Затем используйте pd.concat с groupby + mean. Наконец, объедините столбцы фиксированной серии и переиндексации.

fixed = df1.select_dtypes(include=['object'])
numcols = df1.columns.difference(fixed.columns)

res = pd.concat([df1, df2, df3]).reindex(columns=numcols)\
        .groupby(level=0).mean()\
        .join(fixed).reindex(columns=df1.columns)

print(res)

   Hour    X1   X2        X3     X4
0    0.0  10.0   H   1.000000   0.0
1    1.0  10.0   b   0.666667   0.0
2    2.0  10.0   D   0.666667   0.0
3    3.0  20.0   L   1.000000  10.0
0 голосов
/ 05 января 2019

Делаем с concat, затем agg

pd.concat([df1,df2,df3]).groupby(level=0).agg(lambda x : x.mean() if x.dtype=='int64' else x.head(1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...