Python:使用Pandas在csv中打印行名和匹配的列内容

Python:使用Pandas在csv中打印行名和匹配的列内容,python,csv,pandas,Python,Csv,Pandas,所以,我在Python中使用熊猫。我在csv中阅读的内容类似于: imageName color1 color2 color3 color4 img1 Red Red Red Red img2 Blue Green Red Blue img3 Yellow Blue Red White img4

所以,我在Python中使用熊猫。我在csv中阅读的内容类似于:

imageName     color1     color2     color3     color4
img1          Red        Red        Red        Red
img2          Blue       Green      Red        Blue
img3          Yellow     Blue       Red        White
img4          Blue       Blue       Blue       Blue
如果color1、color2、color3和color4都相等,我想打印rowsby图像名称。 如果我用SQL来做的话

SELECT: imageName 
FROM: rows 
WHERE: color1 == color2 == color3 == color4
会给我img1和img4吗

我对Pandas还很陌生,一直在尝试解决语法问题,但我一直遇到问题

我现在正在尝试的是:

if (df[(df['color1'] == df['color2'] == df['color3'] == df['color4']])]
    print df['imageName']
但不管我怎么做,我都会遇到错误

我得到:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any(), or a.all().

但我正在努力找出在哪里使用这些。或者我是不是走对了路。提前谢谢

这是一种方法,我试图找出一种矢量化方法,基本上是定义一个函数,该函数获取行,然后调用apply,传递函数名和参数axis=1以按行应用。color\u cols只是一个颜色列名列表,由以下定义:color\u cols=[col for col in df if'color'in col]

更快的方法是定义掩码并使用位运算符:

In [27]:
# mask tests if color 1 equals color 2 and color 3 equals color 4 and color 1 equals color 3 if this is true then all must be the same value
mask = (df['color1'] == df['color2']) & (df['color3'] == df['color4']) & (df1['color1'] == df['color3'])
mask
Out[27]:
0     True
1    False
2    False
3     True
dtype: bool
In [28]:

df[mask]['imageName']
Out[28]:
0    img1
3    img4
Name: imageName, dtype: object
时间安排

还有另一个方法调用:

对于此示例数据集,掩码方法比查询和评估方法快2倍以上。apply方法实际上是最快的方法,但它的伸缩性不如其他方法,因为它基本上在每一行上循环。

您可以使用:对于类似的语法:

>>> df.query("color1 == color2 == color3 == color4")
  imageName color1 color2 color3 color4
0      img1    Red    Red    Red    Red
3      img4   Blue   Blue   Blue   Blue
>>> df.query("color1 == color2 == color3 == color4").imageName
0    img1
3    img4
Name: imageName, dtype: object
或者,您可以使用布尔数列编制索引:

>>> df[df.filter(like="color").apply(pd.Series.nunique, axis=1) == 1]
  imageName color1 color2 color3 color4
0      img1    Red    Red    Red    Red
3      img4   Blue   Blue   Blue   Blue

虽然这是微妙的不同,因为努尼克将忽略南

除非你打字很快,否则我认为掩码法还是比较慢的更严重的是,通常查询转换开销意味着您在数组对我来说变得相当大之前不会开始赢取,在这个问题上,df需要大约1百万行才能更快地查询。@DSM确实这会让键入变得很烦人,我有点惊讶eval比querytank you慢一点!正是我想要的
In [39]:

%timeit df[df.eval("color1 == color2 & color3 == color4 & color1 == color3")].imageName
100 loops, best of 3: 7.53 ms per loop

In [40]:

%timeit df[df[color_cols].apply(all_equal, axis=1)].imageName
100 loops, best of 3: 2.55 ms per loop
>>> df.query("color1 == color2 == color3 == color4")
  imageName color1 color2 color3 color4
0      img1    Red    Red    Red    Red
3      img4   Blue   Blue   Blue   Blue
>>> df.query("color1 == color2 == color3 == color4").imageName
0    img1
3    img4
Name: imageName, dtype: object
>>> df[df.filter(like="color").apply(pd.Series.nunique, axis=1) == 1]
  imageName color1 color2 color3 color4
0      img1    Red    Red    Red    Red
3      img4   Blue   Blue   Blue   Blue