我有一个这样的数据框:
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
我想选择这样的数据,如果我的标准是找到yes
的所有A
,我应该得到[x,z]
,即A
的值曾经yes
如果B
,[z]
C
应该给[y]
该怎么办?
答案 0 :(得分:3)
首先通过col1
列创建索引以按loc
进行索引,然后按值进行比较,最后将index
的值获取到list
:
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']
答案 1 :(得分:2)
您可以使用
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
答案 2 :(得分:2)
这是另一个创建函数的
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']
答案 3 :(得分:1)
为您提供的另一个选择-如何使用$("#grid").kendoGrid({
columns: [
{ field: "name" },
{ field: "age" }
],
dataSource: [
{ name: "Jane Doe", age: 30 },
{ name: "John Doe", age: 33 }
],
dataBound: function(e) {
$("#grid").on("mousedown", ".k-grid-cancel-changes", function (e) {
//custom logic
});
}
});
然后使用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})