小能豆

python pandas,DF.groupby().agg(),agg()中的列引用

python

在一个具体问题上,假设我有一个 DataFrame DF

 word  tag count

0 a S 30
1 the S 20
2 a T 60
3 an T 5
4 the T 10
我想为每个“单词”找到“计数”最多的“标签”。所以回报会是这样的

 word  tag count

1 the S 20
2 a T 60
3 an T 5
我不关心计数列或者订单/索引是原始的还是混乱的。返回字典 { ‘the’ : ‘S’ , …} 就可以了。

我希望我能做到

DF.groupby([‘word’]).agg(lambda x: x[‘tag’][ x[‘count’].argmax() ] )
但它不起作用。我无法访问列信息。

更抽象地说,agg( function ) 中的函数将什么视为其参数?

顺便说一句, .agg() 与 .aggregate() 相同吗?

非常感谢。


阅读 66

收藏
2024-05-20

共1个答案

小能豆

要为每个“单词”找到“计数”最多的“标签”,并返回一个字典,你可以使用groupbyapply方法来实现。在这里,agg(或aggregate)方法不太适合,因为它不能直接访问多列的数据来做这种复杂的计算。

你可以按以下步骤进行操作:

  1. 使用groupby方法按word分组。
  2. 使用apply方法在每个组中找到计数最多的标签。
  3. 将结果转换为字典格式。

以下是具体的代码示例:

import pandas as pd

# 创建 DataFrame
data = {
    'word': ['a', 'the', 'a', 'an', 'the'],
    'tag': ['S', 'S', 'T', 'T', 'T'],
    'count': [30, 20, 60, 5, 10]
}
DF = pd.DataFrame(data)

# 定义一个函数来找到每组中计数最多的标签
def get_max_tag(group):
    # 找到最大计数的行
    max_row = group.loc[group['count'].idxmax()]
    return max_row['tag']

# 使用 groupby 和 apply 方法
result = DF.groupby('word').apply(get_max_tag)

# 将结果转换为字典
result_dict = result.to_dict()

print(result_dict)

详细解释

  1. 创建 DataFrame
    python data = { 'word': ['a', 'the', 'a', 'an', 'the'], 'tag': ['S', 'S', 'T', 'T', 'T'], 'count': [30, 20, 60, 5, 10] } DF = pd.DataFrame(data)

  2. 定义函数 get_max_tag
    python def get_max_tag(group): max_row = group.loc[group['count'].idxmax()] return max_row['tag']
    这个函数在每个分组内找到count最大的那一行,并返回对应的tag

  3. 使用 groupbyapply
    python result = DF.groupby('word').apply(get_max_tag)
    apply方法会将get_max_tag函数应用到每个分组中,并返回一个Series,其中索引是word,值是每个单词计数最多的标签。

  4. 转换为字典
    python result_dict = result.to_dict()

to_dict()方法将Series转换为字典格式。

补充

aggaggregate是同一个方法的不同名字,可以互换使用。它们通常用于对单列数据进行聚合操作,比如求和、求平均值等。但在需要同时访问多列的数据时,apply方法更灵活。

希望这个解释和代码示例对你有帮助!如果还有其他问题,请随时问。

2024-05-20