![](/img/trans.png)
[英]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.