基于列值从pandas数据框中提取行

4

我该如何从一个从Excel文件创建的Dataframe中提取列匹配特定值的行?

以下是Dataframe中的几行:

    Food            Men     Women
0   Total fruit     86.20   88.26
1   Apples, Total   89.01   89.66
2   Apples as fruit 89.18   90.42
3   Apple juice     88.78   88.42
4   Bananas         95.42   94.18
5   Berries         84.21   81.73
6   Grapes          88.79   88.13

以下是我用来读取Excel文件,并选择所需列和适当重命名的代码:

data1= pd.read_excel('USFoodCommodity.xls', sheetname='94-98 FAH', skiprows=76,skip_footer=142, parse_cols='A, H, K')
data1.columns = ['Food', 'Men', 'Women']

# Try 1: data1 = data1[data1['Food'].isin(['Total fruit']) == True] works
# Try 2: data1 = data1[data1['Food'].isin(['Apple, Total']) == True] doesn't work
# Try 3: data1 = data1.iloc[[1]] returns Apples, Total but not appropriate to use integer index
# Try 4: data1[data1['Food'] == 'Berries'] doesn't work

到目前为止,根据像这里这里或者这里的回答,我只能够返回第一个"Total fruit"的索引。当我尝试使用以上的其他方法时,我只会得到例如列名之类的结果:
Food    Men Women

我刚接触pandas,但是不知道哪里出了问题。为什么我可以提取Food == Total fruit的第一行,但是其他的行就不行呢?

3个回答

2
对我来说它很好用,也许是一些空格的问题 - 通过 strip 去除它们:
print (data1.Food.tolist())
['Total fruit', 'Apples, Total ', 'Apples as fruit', 
'Apple juice', 'Bananas', ' Berries', 'Grapes']

data1['Food'] = data1['Food'].str.strip()

print (data1.Food.tolist())
['Total fruit', 'Apples, Total', 'Apples as fruit', 
'Apple juice', 'Bananas', 'Berries', 'Grapes']

data2 = data1[data1['Food'].isin(['Total fruit'])]
print (data2)
          Food   Men  Women
0  Total fruit  86.2  88.26

data3 = data1[data1['Food'].isin(['Apples, Total'])]
print (data3)
            Food    Men  Women
1  Apples, Total  89.01  89.66

data3 = data1[data1['Food'].isin(['Berries'])]
print (data3)
      Food    Men  Women
5  Berries  84.21  81.73

0

这个问题可能有点老了,但是这里有一种更简单、更直观的方法。

注意:此解决方案仅适用于 pandas >= 0.13

现在,您可以使用 .query() 方法从数据框中选择列。

它就像这样简单:

df.query('column == value') # The comparison operator can be anything.

例如,在您的情况下,您可以这样查询:
data1.query('Food == "Total Fruit"')

或者

data1.query('Food == Berries')

要访问一个变量,请使用@

fruit = "berries"
data1.query('Food == @fruit')

你甚至可以使用&将多个条件组合在一起。

data1.query('condition1 == value1 & condition2 == value2')

希望它有所帮助。

0
请使用以下代码:
data1= pd.read_excel('USFoodCommodity.xls', sheetname='94-98 FAH', skiprows=76,skip_footer=142, parse_cols='A, H, K')
list_of_strings_to_match = ['Total fruit', 'Berries', 'Grape']
for index, row in data1.iterrows():
   if row['Food'] in list_of_strings_to_match:
      print row

没有关于浆果或葡萄的行结果。 - dreamin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接