大熊猫相当于grep

时间:2017-04-08 01:37:11

标签: python pandas dataframe grep

我是熊猫的新人, 对于数据框,如:

N  Chem    Val
A  Sodium  9
B  Sodium  10
A  Chlorid 7
B  Chlorid 10
A  Sodium  17

我喜欢在bash中使用grep,在第一列中选​​择包含'A'的行,在第三列中选择'Sodium'

A  Sodium  9
A  Sodium  17

我该怎么办?我想我需要使用df[].str.contains()? THX

3 个答案:

答案 0 :(得分:4)

您可以在数据框的列上使用.str.contains()来返回布尔值Series。您还可以在多个系列上执行逻辑andor操作。最后,将逻辑Series作为键传递给数据帧将仅返回true的值。

bool1 = df.N.str.contains('A')          # True for rows of N == 'A'
bool2 = df.Chem.str.contains('Sodium')  # True for rows of Chem == 'Sodium'
df[bool1 & bool2]   # selects rows where N=='A' AND Chem=='Sodium'

returns (without including the index):
N  Chem    Val
A  Sodium  9
A  Sodium  17

答案 1 :(得分:2)

在我看来,使用query是表达此类命令的最自然方式

df.query('N == "A" & Chem == "Sodium"')

   N    Chem  Val
0  A  Sodium    9
4  A  Sodium   17

答案 2 :(得分:1)

如果您只想根据两列选择密钥,最好不要使用包含。这是因为你必须从其他字符串中选择sodium_A,sodium_B等(这意味着它可能比基本的多重选择慢)。

import pandas as pd

# Your sample data
df = pd.read_table('sample.txt', header=None, delim_whitespace=True)

print(df[(df.loc[:, 0] == 'A') & (df.loc[:, 1] == 'Sodium')])

   0       1   2
1  A  Sodium   9
5  A  Sodium  17