从一列中提取数据,另一列有条件 - pandas
Extracting data from one column with condition on other column - pandas
我有如下数据
Cust_ID Age Open_Balance
1 3 ,000.00
1 -15 ,000.00
1 59 ,000.00
2 -1 0,216.00
2 -1 7,523.00
3 需要借助 [Age] 和 [Open_Balance] 中的数据在同一数据框中创建新列,如下所示。
**df['0 to 30']=(df['Open Balance'] if (df['Age ']>0 and df['Age ']<=30) else 0)**
**df['30 to 60']=(df['Open Balance'] if (df['Age ']>30 and df['Age ']<=60) else 0)**
**df['Negative_amount']=(df['Open Balance'] if (df['Age ']<0) else 0)**
结果:
Cust_ID Age Open Balance 0 to 30 30 to 60 Negative amount
1 3 ,000.00 ,000.00 0 0
1 -15 ,000.00 0 0 ,000.00
1 59 ,000.00 0 ,000.00 0
2 -1 0,216.00 0 0 0,216.00
2 -1 7,523.00 0 0 7,523.00
我是 python 的新手,并且尝试了很多来构建具有这些条件的逻辑,但无法做到。请帮助。
我试过如下:(但是它的saying系列有歧义)
CMM['0 到 30'] = CMM['Open Balance '][CMM['Age '] > 0 & CMM['Age '] <= 30]
提高 ValueError(
ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
一堆 numpy.where
语句会在这里做
df['0 to 30'] = np.where( (df['Age']>0) & (df['Age']<=30) , df['Open_Balance'],0)
df['30 to 60'] = np.where( (df['Age']>30) & (df['Age']<=60) , df['Open_Balance'],0)
df['Negative_amount'] = np.where( df['Age']<0, df['Open_Balance'],0)
Cust_ID Age Open_Balance 0 to 30 30 to 60 Negative_amount
0 1 3 ,000.00 ,000.00 0 0
1 1 -15 ,000.00 0 0 ,000.00
2 1 59 ,000.00 0 ,000.00 0
3 2 -1 0,216.00 0 0 0,216.00
4 2 -1 7,523.00 0 0 7,523.00
一个纯粹的Pandas解决方案是这样的:
df['0 to 30'] = df['Open Balance'][df['Age '] > 0 & df['Age '] <= 30]
df['30 to 60'] = df['Open Balance'][df['Age '] > 30 & df['Age '] <= 60]
df['Negative_amount'] = df['Open Balance'][df['Age '] < 0]
这会给您的数据框留下一堆 NaN
值。您可以在这些行之后通过 运行 df.fillna()
摆脱这些。
请注意,pandas 使用的条件语法与纯 Python 代码略有不同。我们在常规 python if 语句中使用 and
和 or
的地方,在 Pandas 和 Numpy 中分别由 &
和 |
替换.
您可以在此处仔细查看 Pandas 索引:
Pandas indexing documentation
我有如下数据
Cust_ID Age Open_Balance
1 3 ,000.00
1 -15 ,000.00
1 59 ,000.00
2 -1 0,216.00
2 -1 7,523.00
3 需要借助 [Age] 和 [Open_Balance] 中的数据在同一数据框中创建新列,如下所示。
**df['0 to 30']=(df['Open Balance'] if (df['Age ']>0 and df['Age ']<=30) else 0)**
**df['30 to 60']=(df['Open Balance'] if (df['Age ']>30 and df['Age ']<=60) else 0)**
**df['Negative_amount']=(df['Open Balance'] if (df['Age ']<0) else 0)**
结果:
Cust_ID Age Open Balance 0 to 30 30 to 60 Negative amount
1 3 ,000.00 ,000.00 0 0
1 -15 ,000.00 0 0 ,000.00
1 59 ,000.00 0 ,000.00 0
2 -1 0,216.00 0 0 0,216.00
2 -1 7,523.00 0 0 7,523.00
我是 python 的新手,并且尝试了很多来构建具有这些条件的逻辑,但无法做到。请帮助。
我试过如下:(但是它的saying系列有歧义)
CMM['0 到 30'] = CMM['Open Balance '][CMM['Age '] > 0 & CMM['Age '] <= 30] 提高 ValueError( ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
一堆 numpy.where
语句会在这里做
df['0 to 30'] = np.where( (df['Age']>0) & (df['Age']<=30) , df['Open_Balance'],0)
df['30 to 60'] = np.where( (df['Age']>30) & (df['Age']<=60) , df['Open_Balance'],0)
df['Negative_amount'] = np.where( df['Age']<0, df['Open_Balance'],0)
Cust_ID Age Open_Balance 0 to 30 30 to 60 Negative_amount
0 1 3 ,000.00 ,000.00 0 0
1 1 -15 ,000.00 0 0 ,000.00
2 1 59 ,000.00 0 ,000.00 0
3 2 -1 0,216.00 0 0 0,216.00
4 2 -1 7,523.00 0 0 7,523.00
一个纯粹的Pandas解决方案是这样的:
df['0 to 30'] = df['Open Balance'][df['Age '] > 0 & df['Age '] <= 30]
df['30 to 60'] = df['Open Balance'][df['Age '] > 30 & df['Age '] <= 60]
df['Negative_amount'] = df['Open Balance'][df['Age '] < 0]
这会给您的数据框留下一堆 NaN
值。您可以在这些行之后通过 运行 df.fillna()
摆脱这些。
请注意,pandas 使用的条件语法与纯 Python 代码略有不同。我们在常规 python if 语句中使用 and
和 or
的地方,在 Pandas 和 Numpy 中分别由 &
和 |
替换.
您可以在此处仔细查看 Pandas 索引: Pandas indexing documentation