python pandas 中的奇怪错误适用
strange error in python pandas apply
下面的代码给了我一个keyError: 0
。如果我删除 [0]
部分,它会起作用。
请注意,我真正想做的是获取组中的每个子数据框,进行一些操作(例如涉及行与列之间的计算),以及 return 一个新的数据框。它类似于 R 中的 ddply 或 data.table groupby 操作。
import pandas as pd
df = pd.DataFrame(dict(a=list('XYXYXYXY'), b=list('AABBCCDD')))
df.groupby('a').apply(lambda x: x['b'][0])
结果:
KeyError Traceback (most recent call last)
<ipython-input-136-7b87ffbc2fd2> in <module>()
1 df = pd.DataFrame(dict(a=list('XYXYXYXY'), b=list('AABBCCDD')))
----> 2 df.groupby('a').apply(lambda x: x['b'][0])
由于 [0]
,您遇到了关键错误。虽然这不是一个完美的描述,但当您指定
df.groupby('a')
您正在为每个分组创建类似(标签、DataFrame)对的迭代器,直到您调用 apply
某些函数才应用于每个 "sub-frames"。例如,
for grp, frame in df.groupby('a'):
print('Group', grp)
print(frame)
print()
Group X
a b
0 X A
2 X B
4 X C
6 X D
Group Y
a b
1 Y A
3 Y B
5 Y C
7 Y D
使用 [0]
将尝试按标签而不是整数位置进行索引,并且您的 DataFrame a
== Y
索引为 [1, 3, 5, 7] .换句话说,你正在尝试做:
df2 = df[df.a=='Y']
df2['b'][0] # Not only is this a key error, it's also chained indexing
您可能会发现这很有用:pandasgroupby 方法实际上是如何工作的?
您的代码的工作版本是
df.groupby('a').apply(lambda x: x.iloc[0,1])
但是你应该更喜欢@juanpa 的解决方案,它在这里会更快。
@BradSolomon 解释了错误的来源。但是,我认为您真正想要的是以下内容:
In [7]: df.groupby('a')['b'].nth(0)
Out[7]:
a
X A
Y A
Name: b, dtype: object
如果您喜欢使用 apply
df.groupby('a').b.apply(lambda x: x.values.tolist()[0])
Out[952]:
a
X A
Y A
Name: b, dtype: object
或尝试
df.groupby('a').b.first()
Out[960]:
a
X A
Y A
Name: b, dtype: object
下面的代码给了我一个keyError: 0
。如果我删除 [0]
部分,它会起作用。
请注意,我真正想做的是获取组中的每个子数据框,进行一些操作(例如涉及行与列之间的计算),以及 return 一个新的数据框。它类似于 R 中的 ddply 或 data.table groupby 操作。
import pandas as pd
df = pd.DataFrame(dict(a=list('XYXYXYXY'), b=list('AABBCCDD')))
df.groupby('a').apply(lambda x: x['b'][0])
结果:
KeyError Traceback (most recent call last)
<ipython-input-136-7b87ffbc2fd2> in <module>()
1 df = pd.DataFrame(dict(a=list('XYXYXYXY'), b=list('AABBCCDD')))
----> 2 df.groupby('a').apply(lambda x: x['b'][0])
由于 [0]
,您遇到了关键错误。虽然这不是一个完美的描述,但当您指定
df.groupby('a')
您正在为每个分组创建类似(标签、DataFrame)对的迭代器,直到您调用 apply
某些函数才应用于每个 "sub-frames"。例如,
for grp, frame in df.groupby('a'):
print('Group', grp)
print(frame)
print()
Group X
a b
0 X A
2 X B
4 X C
6 X D
Group Y
a b
1 Y A
3 Y B
5 Y C
7 Y D
使用 [0]
将尝试按标签而不是整数位置进行索引,并且您的 DataFrame a
== Y
索引为 [1, 3, 5, 7] .换句话说,你正在尝试做:
df2 = df[df.a=='Y']
df2['b'][0] # Not only is this a key error, it's also chained indexing
您可能会发现这很有用:pandasgroupby 方法实际上是如何工作的?
您的代码的工作版本是
df.groupby('a').apply(lambda x: x.iloc[0,1])
但是你应该更喜欢@juanpa 的解决方案,它在这里会更快。
@BradSolomon 解释了错误的来源。但是,我认为您真正想要的是以下内容:
In [7]: df.groupby('a')['b'].nth(0)
Out[7]:
a
X A
Y A
Name: b, dtype: object
如果您喜欢使用 apply
df.groupby('a').b.apply(lambda x: x.values.tolist()[0])
Out[952]:
a
X A
Y A
Name: b, dtype: object
或尝试
df.groupby('a').b.first()
Out[960]:
a
X A
Y A
Name: b, dtype: object