如何定义获取第一个元素的python lambda?
现在,我想使用自己的lambda对数据进行分组,但它们的行为与我预期的不同。下例中的lambda应返回组中列的第一个值:如何定义获取第一个元素的python lambda?,python,pandas,lambda,group-by,Python,Pandas,Lambda,Group By,现在,我想使用自己的lambda对数据进行分组,但它们的行为与我预期的不同。下例中的lambda应返回组中列的第一个值: import pandas as pd df = pd.DataFrame({'A': [0, 0, 1, 1], 'B': [1, 3, 8, 10], 'C': ['alpha', 'bravo', 'charlie', 'delta']}) 代码抛出键错误:0,我不清楚,因为['alpha
import pandas as pd
df = pd.DataFrame({'A': [0, 0, 1, 1],
'B': [1, 3, 8, 10],
'C': ['alpha', 'bravo', 'charlie', 'delta']})
代码抛出键错误:0
,我不清楚,因为['alpha','bravo'][0]
给出了'alpha'
因此,总体而言,期望的输出:
df.groupby('A', as_index = False).agg({'B':'mean',
'C': lambda x: x[0]})
如果需要选择组中的第一个值,则使用或按位置选择:
A B C
0 0 2 'alpha'
1 1 9 'charlie'
另一个解决方案是使用:
你能解释一下为什么lambda不起作用吗 问题是对于第二组,索引不是
0
,而是2
,这会产生错误,因为x[0]
尝试使用0
按索引查看LCT,对于第二组,它不存在:
df1 = df.groupby('A', as_index = False).agg({'B':'mean', 'C': 'first'})
print (df1)
A B C
0 0 2 alpha
1 1 9 charlie
小型解释
lambda
函数无法工作的原因
当我们使用groupby
时,我们得到一个groupby对象:
df = pd.DataFrame({'A': [0, 0, 1, 1],
'B': [1, 3, 8, 10],
'C': ['alpha', 'bravo', 'charlie', 'delta']}, index=[0,1,0,1])
print (df)
A B C
0 0 1 alpha <- index is 0
1 0 3 bravo
0 1 8 charlie <- index is 0
1 1 10 delta
df1 = df.groupby('A', as_index = False).agg({'B':'mean', 'C': lambda x: x[0]})
print (df1)
A B C
0 0 2 alpha
1 1 9 charlie
这就是为什么我们需要将这些元素作为数据帧进行威胁。正如耶兹雷尔在回答中指出的那样,有几种方法可以访问C
列中的第一个值:
for idx, d in g:
print(d, '\n')
A B C
0 0 1 alpha
1 0 3 bravo
A B C
2 1 8 charlie
3 1 10 delta
你能解释一下为什么lambda不起作用吗?@Barmar-给你解释一下。
df = pd.DataFrame({'A': [0, 0, 1, 1],
'B': [1, 3, 8, 10],
'C': ['alpha', 'bravo', 'charlie', 'delta']}, index=[0,1,0,1])
print (df)
A B C
0 0 1 alpha <- index is 0
1 0 3 bravo
0 1 8 charlie <- index is 0
1 1 10 delta
df1 = df.groupby('A', as_index = False).agg({'B':'mean', 'C': lambda x: x[0]})
print (df1)
A B C
0 0 2 alpha
1 1 9 charlie
g = df.groupby('A')
print(g)
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x0000023AA1BB41D0>
for idx, d in g:
print(d, '\n')
A B C
0 0 1 alpha
1 0 3 bravo
A B C
2 1 8 charlie
3 1 10 delta
for idx, d in g:
print(d['C'].iat[0])
print(d['C'].iloc[0], '\n')
alpha
alpha
charlie
charlie