我在熊猫的条件栏上也提出了类似的问题,但是在处理新发行的书时有点卡住了。示例数据集如下:
Name Date Type Currency
0 John *2017-07-06 BTC USD
1 John *2017-07-06 Paypal USD
2 John *2017-07-06 Fastspring USD
3 John 2017-07-10 EU EUR
4 John 2017-07-10 PayPal USD
5 John 2017-07-10 PayPal USD
6 John *2017-07-12 BTC EUR
7 John *2017-07-12 Fastspring USD
8 Susan 2017-07-06 EU EUR - Dates Restart Again on Susan
9 Susan 2017-07-06 PayPal USD
10 Susan 2017-07-10 BTC USD
11 Susan 2017-07-12 PayPal USD
我试图添加一个条件列,每个包含“ BTC”的日期在名为“覆盖”的新列中具有匹配日期的行中产生一个“是”值,所需的输出如下:
Name Date Type Currency Covered
0 John *2017-07-06 BTC USD Yes*
1 John *2017-07-06 Paypal USD Yes*
2 John *2017-07-06 Fastspring USD Yes*
3 John 2017-07-10 EU EUR No
4 John 2017-07-10 PayPal USD No
5 John 2017-07-10 PayPal USD No
6 John *2017-07-12 BTC EUR Yes*
7 John *2017-07-12 Fastspring USD Yes*
8 Susan 2017-07-06 EU EUR No - Dates Restart Again on Susan
9 Susan 2017-07-06 PayPal USD No
10 Susan 2017-07-10 BTC USD Yes*
11 Susan 2017-07-12 PayPal USD No
我首先使用groupby和isin按日期分组:-更新代码-感谢@Quang Hoang非常接近解决问题,只需要用每个新名称重设即可。
df['Covered'] = np.where(df['Type'].eq('BTC')
.groupby(df['Date'])
.transform('any'),
'Yes', 'No')
但是我仍然只为包含“ BTC”的特定行生成值,而不是为每个日期组包含“ BTC”的值生成所有行,就像我想要的输出一样。
有什么建议吗?我在这里需要作出任何澄清,谢谢所有能提供帮助的人。
答案 0 :(得分:1)
您可以先检查Type
是否为BTC
并使用groupby().transform
:
df['Covered'] = np.where(df['Type'].eq('BTC')
.groupby(df['Date'])
.transform('any'), # 'max' also works
'Yes', 'No')
输出:
Date Type Currency Covered
0 2017-07-06 BTC USD Yes
1 2017-07-06 Paypal USD Yes
2 2017-07-06 Fastspring USD Yes
3 2017-07-10 EU EUR No
4 2017-07-10 PayPal USD No
5 2017-07-10 PayPal USD No
6 2017-07-12 BTC EUR Yes
7 2017-07-12 Fastspring USD Yes
8 2017-07-14 EU EUR No
9 2017-07-14 PayPal USD No