Панды: Создать новый фрейм данных, который усредняет дубликаты из другого фрейма данных

Скажем, у меня есть кадр данных my_df с дубликатами столбцов, например ...

foo bar foo hello
0   1   1   5
1   1   2   5
2   1   3   5

Я хотел бы создать другой фрейм данных, который усреднит дубликаты:

foo bar hello
0.5   1   5
1.5   1   5
2.5   1   5

Как я могу сделать это в Pandas?

До сих пор мне удалось идентифицировать дубликаты:

my_columns = my_df.columns
my_duplicates = print [x for x, y in collections.Counter(my_columns).items() if y > 1]

Я не знаю, как попросить Панд усреднить их.

7 голосов | спросил Amelio Vazquez-Reina 22 Mayam13 2013, 00:05:49

1 ответ


0

Вы можете groupby индекс столбца и взять mean :

In [11]: df.groupby(level=0, axis=1).mean()
Out[11]:
   bar  foo  hello
0    1  0.5      5
1    1  1.5      5
2    1  2.5      5

Несколько более хитрый пример, если есть нечисловой столбец:

In [21]: df
Out[21]:
   foo  bar  foo hello
0    0    1    1     a
1    1    1    2     a
2    2    1    3     a

Выше приведено: DataError: No numeric types to aggregate. Определенно не выиграет любые призы за эффективность, но вот общий метод, который нужно сделать в этом случае:

In [22]: dupes = df.columns.get_duplicates()

In [23]: dupes
Out[23]: ['foo']

In [24]: pd.DataFrame({d: df[d] for d in df.columns if d not in dupes})
Out[24]:
   bar hello
0    1     a
1    1     a
2    1     a

In [25]: pd.concat(df.xs(d, axis=1) for d in dupes).groupby(level=0, axis=1).mean()
Out[25]:
   foo
0  0.5
1  1.5
2  2.5

In [26]: pd.concat([Out[24], Out[25]], axis=1)
Out[26]:
   foo  bar hello
0  0.5    1     a
1  1.5    1     a
2  2.5    1     a

Я думаю, что нужно избегать дублирования столбцов ... или, может быть, я не знаю, что делаю.

ответил Andy Hayden 22 Mayam13 2013, 00:17:08

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132