Python 如何根据行中的条件选择列?
我有一个数据帧df,只想选择第[0]行中具有特定值“xyz”的列 我知道如果我试图选择列[0]中具有特定值“xyz”的行,我只会执行以下操作: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[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')。