以以下数据框为例:
df = pd.DataFrame({'Sample':['X', 'Y', 'Z'], 'Base':[2, 10, 3], 'A':[0,5,100], 'C':[0,10,7]})
如果要满足两个条件,我想添加一个名为df["indices"]
和/或df["A"]
的列的新列:
df["C"]
或df["A"]/df["Base"]
必须大于或等于1 结果数据框将是:
df["C"]/df["Base"]
我可以使用df = pd.DataFrame({'Sample':['X', 'Y', 'Z'], 'Base':[2, 20, 3], 'A':[0,6,100], 'C':[0,10,7], 'indices': ['','C','A,C']})
获得第一个条件的True或False值,但是我无法使其与基于数据帧中另一列的条件2一起使用。在新的专栏中获取我在其中获得True的索引又是另一回事了。我想像有apply和get_loc或index的东西,但是无论如何尝试,我都无法使其正常工作。
答案 0 :(得分:0)
在满足任意多个条件时,您可以使用df.loc
将值分配回该列。一种简单的方法是让其中的3个具有您所需的条件。如果您愿意,也可以将np.where
链接在一起以达到相同的目的。
import pandas as pd
df = pd.DataFrame({'Sample':['X', 'Y', 'Z'],
'Base':[2, 10, 3],
'A':[0,5,100],
'C':[0,10,7]})
df.loc[(df['A'] / df['Base'] >=1) & (df['C'] / df['Base'] >=1), 'indicies'] = 'A,C'
df.loc[(df['A'] / df['Base'] >=1) & (df['C'] / df['Base'] <1), 'indicies'] = 'A'
df.loc[(df['A'] / df['Base'] <1) & (df['C'] / df['Base'] >=1), 'indicies'] = 'C'
输出
Sample Base A C indicies
0 X 2 0 0 NaN
1 Y 10 5 10 C
2 Z 3 100 7 A,C
答案 1 :(得分:0)
让我们创建一个满足两个给定条件的布尔掩码,然后在此掩码上使用DataFrame.dot
来获取索引:
m = df[['A', 'C']].gt(5) & df[['A', 'C']].div(df['Base'], axis=0).ge(1)
df['indices'] = m.dot(m.columns + ',').str.rstrip(',')
Sample Base A C indices
0 X 2 0 0
1 Y 10 5 10 C
2 Z 3 100 7 A,C