[英]How to populate a dataframe column based on condition met in another column
[英]How to fetch a column header if a particular condition is met based on row and column value of the dataframe?
我有一个这样的数据框:
col1 x y z
A yes no yes
B no no yes
C no yes no
D yes no yes
E no no yes
F yes yes no
我想选择这样的数据,如果我的标准是找到A
所有yes
,我应该得到[x,z]
,即A
的值为yes
如果B
, [z]
C
应给出[y]
该怎么办?
首先按col1
列创建索引以按loc
进行索引,按值进行比较,最后获取要list
index
值:
df = df.set_index('col1')
def get_val(df, idx, val):
a = df.loc[idx].eq(val)
return a.index[a].tolist()
print (get_val(df, 'A', 'yes'))
['x', 'z']
print (get_val(df, 'B', 'yes'))
['z']
print (get_val(df, 'C', 'yes'))
['y']
你可以用
In [499]: df.eq('yes').dot(df.columns)[df.col1.eq('A')]
Out[499]:
0 xz
dtype: object
In [500]: df.eq('yes').dot(df.columns)[df.col1.eq('B')]
Out[500]:
1 z
dtype: object
In [501]: df.eq('yes').dot(df.columns)[df.col1.eq('C')]
Out[501]:
2 y
dtype: object
这是另一个创建函数的函数:
df.set_index('col1', inplace=True)
def find_yes(df, x):
return df.columns[df.loc[x] == 'yes'].tolist()
完整的例子
import pandas as pd
data = '''\
col1 x y z
A yes no yes
B no no yes
C no yes no
D yes no yes
E no no yes
F yes yes no'''
fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj, sep='\s+')
df.set_index('col1', inplace=True)
def find_yes(df, x):
return df.columns[df.loc[x] == 'yes'].tolist()
print(find_yes(df, 'A'))
print(find_yes(df, 'B'))
返回值:
['x', 'z']
['z']
为您提供的groupby
一种选择-如何使用melt
然后使用groupby
:
from io import StringIO
import pandas as pd
data = StringIO('''col1 x y z
A yes no yes
B no no yes
C no yes no
D yes no yes
E no no yes
F yes yes no''')
df = pd.read_csv(data, sep='\s+')
m = df.melt(id_vars='col1')
matches = m[m['value'] == 'yes'].groupby('col1')\
.agg({'variable': list})
这给出了以下数据框:
variable
col1
A [x, z]
B [z]
C [y]
D [x, z]
E [z]
F [x, y]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.