此问题非常与这两个问题another和thisone相关,我甚至会使用该问题中非常有用的公认解决方案中的示例。以下是已接受的解决方案(信贷到unutbu)的示例:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
'B': 'one one two three two two one three'.split(),
'C': np.arange(8), 'D': np.arange(8) * 2})
print(df)
# A B C D
# 0 foo one 0 0
# 1 bar one 1 2
# 2 foo two 2 4
# 3 bar three 3 6
# 4 foo two 4 8
# 5 bar two 5 10
# 6 foo one 6 12
# 7 foo three 7 14
print(df.loc[df['A'] == 'foo'])
产量
A B C D
0 foo one 0 0
2 foo two 2 4
4 foo two 4 8
6 foo one 6 12
7 foo three 7 14
但是我想拥有A的所有行,只有B中的箭头中有'两个'。我的尝试是尝试
print(df.loc[df['A']) & df['B'] == 'two'])
不幸的是,这不起作用。任何人都可以提出一种方法来实现这样的东西吗?如果解决方案有点普遍,那将是一个很大的帮助,例如,列A不具有相同的值,即'foo'但具有不同的值,并且您仍然需要整个列。
答案 0 :(得分:3)
我认为我理解您修改过的问题。在B
条件下进行子选择后,您可以选择所需的列,例如:
In [1]: df.loc[df.B =='two'][['A', 'B']]
Out[1]:
A B
2 foo two
4 foo two
5 bar two
例如,如果我想连接A列的所有字符串,其中B列的值为'two'
,那么我可以这样做:
In [2]: df.loc[df.B =='two'].A.sum() # <-- use .mean() for your quarterly data
Out[2]: 'foofoobar'
您还可以groupby
B列的值,并从一个表达式中为每个不同的B组获取此类连接结果:
In [3]: df.groupby('B').apply(lambda x: x.A.sum())
Out[3]:
B
one foobarfoo
three barfoo
two foofoobar
dtype: object
过滤A
和 B
使用numpy.logical_and
:
In [1]: df.loc[np.logical_and(df.A == 'foo', df.B == 'two')]
Out[1]:
A B C D
2 foo two 2 4
4 foo two 4 8
答案 1 :(得分:3)
行子集:这不是您要找的吗?
df.loc[(df['A'] == 'foo') & (df['B'] == 'two')]
A B C D
2 foo two 2 4
4 foo two 4 8
您还可以在末尾添加.reset_index()
以从零开始初始化索引。