Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 若基于dataframe的行和列值满足特定条件,如何获取列标题?_Python_Pandas_Dataframe - Fatal编程技术网

Python 若基于dataframe的行和列值满足特定条件,如何获取列标题?

Python 若基于dataframe的行和列值满足特定条件,如何获取列标题?,python,pandas,dataframe,Python,Pandas,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] 怎么办?您可以使用 In [499]: df.eq('yes').dot(d

我有这样一个数据帧:

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]

怎么办?

您可以使用

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
你可以用

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

首先按
col1
列创建索引,以便按
loc
索引,然后按值进行比较,最后将
索引
值添加到
列表

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']

首先按
col1
列创建索引,以便按
loc
索引,然后按值进行比较,最后将
索引
值添加到
列表

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']

下面是创建函数的另一个示例:

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']

下面是创建函数的另一个示例:

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']

您还有一个选择-使用
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]

您还有一个选择-使用
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]

@jezrael Ty,还注意到不需要np.nonzero(ofc..)@jezrael Ty,还注意到不需要np.nonzero(ofc..)如何在出现值时提取列。在大多数情况下,它只会给出一行。我尝试了这个
df=df[df.index.str.contain(val)]
@qwww-你可以使用
a=df.eq(val)。any()
print(a.index[a].tolist())
'StringMethods'对象没有属性'contain',这是什么错误?当我使用str时,我得到了它。contain@qwww-这是打字错误,需要
str.contains
和last
s
如果要检查子字符串如何在出现值时提取列。在大多数情况下,它只会给出一行。我尝试了这个
df=df[df.index.str.contain(val)]
@qwww-你可以使用
a=df.eq(val)。any()
print(a.index[a].tolist())
'StringMethods'对象没有属性'contain',这是什么错误?当我使用str时,我得到了它。contain@qwww-这是打字错误,需要
str.contains
和last
s
如果要检查子字符串