Python 如何根据行中的条件选择列?

Python 如何根据行中的条件选择列?,python,pandas,numpy,Python,Pandas,Numpy,我有一个数据帧df,只想选择第[0]行中具有特定值“xyz”的列 我知道如果我试图选择列[0]中具有特定值“xyz”的行,我只会执行以下操作: df[df[0] == 'xyz'] 现在我试着: df[df.loc[0] == 'xyz'] 我得到一个错误: IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object d

我有一个数据帧df,只想选择第[0]行中具有特定值“xyz”的列

我知道如果我试图选择列[0]中具有特定值“xyz”的行,我只会执行以下操作:

df[df[0] == 'xyz']
现在我试着:

df[df.loc[0] == 'xyz']
我得到一个错误:

IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match
为什么选择有条件的列时,相同的操作不起作用?要获得我想要的列,最简单的解决方案是什么?

假设df包含:

    Aa   Bb   Cc   Dd
0  xyz  abc  xyz  efg
1   e1   e2   e3   e4
2   f1   f2   f3   f4
生成布尔向量(实际上是一个系列)检查 第0行中的连续单元格=='xyz',您可以运行:

df.iloc[0] == 'xyz'
结果是:

Aa     True
Bb    False
Cc     True
Dd    False
Name: 0, dtype: bool
Index(['Aa', 'Cc'], dtype='object')
    Aa   Cc
0  xyz  xyz
1   e1   e3
2   f1   f3
要获取感兴趣的列的名称,请运行:

df.columns[df.iloc[0] == 'xyz']
结果是:

Aa     True
Bb    False
Cc     True
Dd    False
Name: 0, dtype: bool
Index(['Aa', 'Cc'], dtype='object')
    Aa   Cc
0  xyz  xyz
1   e1   e3
2   f1   f3
因此,要获得预期结果,请使用上面的 括号内的表达式:

df[df.columns[df.iloc[0] == 'xyz']]
结果是:

Aa     True
Bb    False
Cc     True
Dd    False
Name: 0, dtype: bool
Index(['Aa', 'Cc'], dtype='object')
    Aa   Cc
0  xyz  xyz
1   e1   e3
2   f1   f3
关于代码示例的注释 您的第一个代码示例-
df[0]==“xyz”
失败,因为
df[0]
尝试检索名为0的列。 由于您的数据帧不包含这样的列,因此出现KeyError:0 提出了例外情况

第二个代码示例-
df[df.loc[0]=='xyz']
是一个更好的方法。 请注意,
df.loc[0]='xyz'
正是我所建议的

失败的原因是你现在尝试了类似的事情 列上的布尔索引,但在本例中它不起作用。 在括号之间,可以传递列名列表,而不是列名列表 “布尔指示符”。

假设df包含:

    Aa   Bb   Cc   Dd
0  xyz  abc  xyz  efg
1   e1   e2   e3   e4
2   f1   f2   f3   f4
生成布尔向量(实际上是一个系列)检查 第0行中的连续单元格=='xyz',您可以运行:

df.iloc[0] == 'xyz'
结果是:

Aa     True
Bb    False
Cc     True
Dd    False
Name: 0, dtype: bool
Index(['Aa', 'Cc'], dtype='object')
    Aa   Cc
0  xyz  xyz
1   e1   e3
2   f1   f3
要获取感兴趣的列的名称,请运行:

df.columns[df.iloc[0] == 'xyz']
结果是:

Aa     True
Bb    False
Cc     True
Dd    False
Name: 0, dtype: bool
Index(['Aa', 'Cc'], dtype='object')
    Aa   Cc
0  xyz  xyz
1   e1   e3
2   f1   f3
因此,要获得预期结果,请使用上面的 括号内的表达式:

df[df.columns[df.iloc[0] == 'xyz']]
结果是:

Aa     True
Bb    False
Cc     True
Dd    False
Name: 0, dtype: bool
Index(['Aa', 'Cc'], dtype='object')
    Aa   Cc
0  xyz  xyz
1   e1   e3
2   f1   f3
关于代码示例的注释 您的第一个代码示例-
df[0]==“xyz”
失败,因为
df[0]
尝试检索名为0的列。 由于您的数据帧不包含这样的列,因此出现KeyError:0 提出了例外情况

第二个代码示例-
df[df.loc[0]=='xyz']
是一个更好的方法。 请注意,
df.loc[0]='xyz'
正是我所建议的

失败的原因是你现在尝试了类似的事情 列上的布尔索引,但在本例中它不起作用。 在括号之间,可以传递列名列表,而不是列名列表
“布尔指标”。

这里有一种方法。我使用的是虚拟数据

df = pd.DataFrame({"x": pd.date_range("2020-01-01", periods = 10, freq = "D"), 
                  "y": range(10), 
                  "z": range(10, 20), 
                   "w": range(10, 30, 2)
                  })
                 
print(df)

==>
           x  y   z   w
0 2020-01-01  0  10  10
1 2020-01-02  1  11  12
2 2020-01-03  2  12  14
3 2020-01-04  3  13  16
4 2020-01-05  4  14  18
...
我现在只想得到第一行中有“10”的列

cols = (df.iloc[0] == 10)

new_df = df.loc[:, cols[cols].index]
print(new_df)


   ==>
        z   w
    0  10  10
    1  11  12
    2  12  14
    3  13  16
    4  14  18
    ...

这里有一个方法。我使用的是虚拟数据

df = pd.DataFrame({"x": pd.date_range("2020-01-01", periods = 10, freq = "D"), 
                  "y": range(10), 
                  "z": range(10, 20), 
                   "w": range(10, 30, 2)
                  })
                 
print(df)

==>
           x  y   z   w
0 2020-01-01  0  10  10
1 2020-01-02  1  11  12
2 2020-01-03  2  12  14
3 2020-01-04  3  13  16
4 2020-01-05  4  14  18
...
我现在只想得到第一行中有“10”的列

cols = (df.iloc[0] == 10)

new_df = df.loc[:, cols[cols].index]
print(new_df)


   ==>
        z   w
    0  10  10
    1  11  12
    2  12  14
    3  13  16
    4  14  18
    ...

df[]
是通过列访问数据的便捷方式。但是,如果要根据行条件选择值,则需要使用
df.loc[df.loc[0]==“xyz']]
->这让Pandas知道要在行上进行选择。然后将布尔序列与数据帧对齐,以返回output@sammywemmy我得到错误
索引错误:作为索引器提供的不可对齐的布尔序列(布尔序列和索引对象的索引不匹配
?但这将在列上进行选择。请共享一些数据。请添加示例输入和预期输出,这会有很大帮助。
df.loc[df[0]==“xyz”]
。我正在练习使用虚拟数据。这可能与您拥有的数据不同。
df[]
是一种通过列访问数据的便捷方式。但是,如果您想根据行条件选择值,则需要使用
df.loc[df.loc[0]=='xyz']
->这让Pandas知道您要在行上进行选择。Pandas然后将布尔序列与数据帧对齐,以返回output@sammywemmy我得到错误
索引错误:作为索引器提供的不可对齐的布尔序列(布尔序列和索引对象的索引不匹配
?但这将在列中选择。请共享一些数据。请添加示例输入和预期输出,这会有很大帮助。
df.loc[df[0]==“xyz”]
。我正在练习使用虚拟数据。这可能与您拥有的数据不同。感谢您的解释。您将如何添加更多条件?例如,您还希望包含一列
df[df.columns[df.iloc[0]=='xyz']]和df[1]
或另一个条件,如
df.loc[0]=='xyz'和df.loc[1]=='abc']
?是的。尝试自己运行括号之间的代码(例如df.iloc[0]='xyz'和df.iloc[1]='abc'),您将看到满足条件的列的布尔向量。然后将此代码放入整个代码中,以检索这些列。我得到
值错误:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。
原因是运算符的优先级。请将我之前的注释中的代码更改为df.iloc[0]。eq('xyz')&df.iloc[1]。eq('abc')。感谢您的解释。您将如何添加更多条件?例如,您还希望包含一列
df[df.columns[df.iloc[0]=='xyz']]和df[1]
或其他条件,如df.loc[0]=“xyz”和df.loc[1]=“abc”]?是。请自己尝试在括号之间运行代码(例如df.iloc[0]=“xyz”和df.iloc[1]=“abc”)您将看到满足您条件的列的布尔向量。然后将此代码放在整个代码中,以检索这些列。我得到
ValueError:序列的真值是不明确的。使用a.empty、a.bool()、a.item()、a.any()或a.all()。
原因是运算符的优先级。将我前面注释中的代码更改为df.iloc[0].eq('xyz')&df.iloc[1]。eq('abc')。