【问题标题】:How to apply a lambda function to the Pandas DataFrame.groupby using a group-specific condition?如何使用特定于组的条件将 lambda 函数应用于 Pandas DataFrame.groupby?
【发布时间】:2018-06-21 02:50:18
【问题描述】:

我一直在尝试在 groupby 之后将 lambda 函数应用于数据帧中的列,但函数中有一个特定于每个组的条件。请参阅以下内容:

df.groupby('column_1')['column_2'].apply(lambda x: a if x == df.groupby('column_1')['column_3'] else x)

目的是将dataframe按column_1分组,根据column_3中对应的值改变column_2的值在同一组内

这是我得到的错误:“无效类型比较”

顺便提一下,column_2 和column_3 都是整数。

我还设置了一个值而不是系列的条件。因为每组内column_3的值都是一样的,所以我尝试在条件中添加“.first()”:

df.groupby('column_1')['column_2'].apply(lambda x: a if x == df.groupby('column_1')['column_3'].first() else x)

这是我得到的错误:“只能比较标签相同的系列对象”

关于如何解决这个问题或替代实现的任何想法?

非常感谢!

Sample data:
column_1 column_2 column_3
0        0        2
0        1        2
0        2        2
0        3        2
1        0        0
1        1        0
1        2        0
1        3        0

Expected output:
column_1 column_2 column_3
0        0        2
0        1        2
0        a        2
0        3        2
1        a        0
1        1        0
1        2        0
1        3        0

【问题讨论】:

  • 请提供示例数据和预期输出。
  • 我不明白这不只是像 { df['column_2'] = np.where(df['column_2'] == df['column_3' ],'a',df['column_2']) }。分组背后的原因是什么?
  • 是的,你是对的。看来我已经迷上了groupby。我从另一个需要分组的问题中解决了这个问题。我们现在干什么?我应该删除问题吗?或者这仍然是一个值得思考的合理问题吗?

标签: python python-3.x pandas lambda pandas-groupby


【解决方案1】:

有一个更简单的解决方案。如果您的目标是按组比较两列中的值,则无需添加第二个分组。只需传递一个函数,该函数将在分组中比较您想要的列

这是一个例子。首先,我生成一些示例数据并按第一列“a”对其进行排序,我将其视为分组列。

import pandas as pd
import numpy as np

n = 20
data = np.random.randint(low=0, high=3, size = (n,3))


df = pd.DataFrame(data=data, columns = list('abc')).sort_values(by = 'a')

df
Out[15]: 
    a  b  c
9   0  1  1
1   0  0  1
2   0  1  1
3   0  1  2
4   0  1  0
5   0  0  1
6   0  2  1
7   0  1  2
8   0  1  0
16  1  2  2
13  1  0  1
0   1  1  0
18  1  0  2
19  1  1  2
12  2  0  0
10  2  2  1
14  2  1  0
15  2  0  0
17  2  0  1
11  2  0  0

然后,我应用分组和比较。

df.groupby(by = 'a').apply(lambda frame: frame['b'] == frame['c'])
a    
0  9      True
   1     False
   2      True
   3     False
   4     False
   5     False
   6     False
   7     False
   8     False
1  16     True
   13    False
   0     False
   18    False
   19    False
2  12     True
   10    False
   14    False
   15     True
   17    False
   11     True
dtype: bool

不知道我是怎么错过的,但你有

"目的是按照column_1对dataframe进行分组,根据column_3在同一组内的对应值改变column_2的值。"

然后,一个解决方案可能是使用生成的真值,例如

bools = df.groupby(by = 'a').apply(lambda frame: frame['b'] == frame['c']).values

df['test'] = df['b']

df['test'].loc[~bools] = df['c'].loc[~bools]

【讨论】:

  • 谢谢,但在最后一行,新的“test”列中的值最终与“c”列中的值相同。
  • 您可以将其替换为您需要的任何值。我只是举个例子。
  • 我的意思是 "df['test'].loc[~bools] = df['c'].loc[~bools]" 表现为 "df['test'] = df[' c']。”
  • 我不同意这个答案。你真的不需要在这里申请。
猜你喜欢
  • 1970-01-01
  • 2018-06-19
  • 2021-05-27
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2020-11-22
  • 2020-08-16
  • 2013-11-15
相关资源
最近更新 更多