Python:使用Pandas在csv中打印行名和匹配的列内容
所以,我在Python中使用熊猫。我在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
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