pandas 如何将同一个键的多行与一个不同的列值转换为一行,其中包含每个键的变量列的计数[重复]

mmvthczy  于 2023-11-15  发布在  其他
关注(0)|答案(2)|浏览(150)

此问题在此处已有答案

Get statistics for each group (such as count, mean, etc) using pandas GroupBy?(11个回答)
7天前关闭
我有一个结构像这样的框架:

  1. pd.DataFrame(
  2. {'col1':['foo','foo','foo','foo','foo','foo'],'col2':['bar','bar','bar','bar','bar','bar'],'col3':['baz','baz','baz','baz','baz','baz'],'varying_column':['x','y','z','d','e','f']},index=['a','b','c','a','a','b']
  3. ).reset_index()
  4. my_key col1 col2 col3 varying_column
  5. 0 a foo bar baz x
  6. 1 b foo bar baz y
  7. 2 c foo bar baz z
  8. 3 a foo bar baz d
  9. 4 a foo bar baz e
  10. 5 b foo bar baz f

字符串
其中每一行都有一个索引值,并且有一列是变化的。我想做的是通过创建一个新的列来为每个索引创建一行,该列是varying_column的计数,如下所示:

  1. my_key col1 col2 col3 count_varying_column
  2. 0 a foo bar baz 3
  3. 1 b foo bar baz 2
  4. 2 c foo bar baz 1


我假设这可以通过做某种groupbyindex,计数varying_column,也许unstack来完成?
在我的真实的数据中,其他列也有不同的值,但这与这个问题无关,因此为了简单起见,我将它们保持不变。
注意事项:这不仅仅是一个简单的按集合分组,就像在this stack overflow thread中讨论的那样。是的,我想要每个组的计数,但是这个问题是不同的,因为我想删除varying_column的重复项,并将其替换为一个新的列,每个键值有一行,新的列count_varying_column是每个键varying_column的计数。

fcy6dtqo

fcy6dtqo1#

试试这个:

  1. import pandas as pd
  2. df = pd.DataFrame(
  3. {'col1':['foo','foo','foo','foo','foo','foo'],'col2':['bar','bar','bar','bar','bar','bar'],'col3':['baz','baz','baz','baz','baz','baz'],'varying_column':['x','y','z','d','e','f']},index=['a','b','c','a','a','b']
  4. ).reset_index()
  5. df.groupby(['index','col1','col2','col3']).count().rename(columns={'varying_column':'count_varying_column'}).reset_index()
  6. index col1 col2 col3 count_varying_column
  7. 0 a foo bar baz 3
  8. 1 b foo bar baz 2
  9. 2 c foo bar baz 1

字符串

wfveoks0

wfveoks02#

您可以将groupby方法与size结合使用来计算出现次数,然后将此结果与原始DataFrame合并以获得唯一行。之后,您可以根据'my_key'列删除重复行。
以下是您的操作方法:

  1. df = pd.DataFrame({
  2. 'my_key': ['a', 'b', 'c', 'a', 'a', 'b'],
  3. 'col1': ['foo', 'foo', 'foo', 'foo', 'foo', 'foo'],
  4. 'col2': ['bar', 'bar', 'bar', 'bar', 'bar', 'bar'],
  5. 'col3': ['baz', 'baz', 'baz', 'baz', 'baz', 'baz'],
  6. 'varying_column': ['x', 'y', 'z', 'd', 'e', 'f']
  7. })
  8. counts = df.groupby('my_key').size().reset_index(name='count_varying_column')
  9. result = pd.merge(df.drop_duplicates(subset='my_key'), counts, on='my_key')
  10. result = result.drop(columns=['varying_column'])
  11. print(result)

字符串

展开查看全部

相关问题