鉴于此数据框:
import pandas as pd
df = pd.DataFrame(
{'A' : ['foo', 'foo', 'foo', 'foo',
'bar', 'bar', 'bar', 'bar'],
'D' : [2, 4, 4, 2, 5, 4, 3, 2]})
DF
A D
0 foo 2
1 foo 4
2 foo 4
3 foo 2
4 bar 5
5 bar 4
6 bar 3
7 bar 2
我想得到一个行数,其中A列=' foo'和列D = 2。 然后我想把结果放在一个新的列中:
#First, I filter
df2=df.loc[(df['A']=='foo')&(df['D']==2)]
#Then, I use groupby and lambda x to count
df['Dcount']=df2.groupby(['D'])['D'].transform(lambda x: x.count())
df
我明白了:
A D Dcount
0 foo 2 2
1 foo 4 NaN
2 foo 4 NaN
3 foo 2 2
4 bar 5 NaN
5 bar 4 NaN
6 bar 3 NaN
7 bar 2 NaN
但是,我得到了" SettingWithCopyWarning": 尝试在DataFrame的切片副本上设置值。 尝试使用.loc [row_indexer,col_indexer] = value而不是
我的问题是:这种警告在这种情况下是否重要? 另外,如果pandas从另一个数据帧中获取行,它们如何知道如何正确匹配行?
答案 0 :(得分:3)
这种警告在这种情况下是否重要?
我看到许多事情的警告,并且它从来没有对我产生任何影响。我忽略了它。
另外,如果pandas从另一个数据帧中获取行,它们如何知道如何正确匹配行?
pandas正在使用DataFrame的索引。这是您的示例,为了清晰起见,稍作重写:
df2 = df.query('A=="foo" and D==2')
df2['Dcount'] = len(df2)
生成的DataFrame是
A D Dcount
0 foo 2 2
3 foo 2 2
请注意索引中的0
和3
?这就是大熊猫用来排队的东西。所以我可以使用上面的
df['Dcount'] = df2['Dcount']
我将得到相同的结果。该分配的右侧是一个系列,因此索引是内置的。
另一方面,我会得到一个错误,我试图分配一个数组:
df['Dcount'] = df2['Dcount'].values # length error