如何迭代 pandas 数据框并根据第三列比较某些列?

How to iterate over a pandas dataframe and compare certain columns based on a third column?

我是 pandas 的新手,很难以方便的方式使用它的功能。

我有一个大型数据框,其中包含我想比较的两个不同测试的实验数据。理想情况下,数据显示在图中。

## what I have:
import pandas as pd

ids = [
    'Bob','Bob',
    'John', 'John',
    'Mary', 'Mary',
    ]
var = [
    'a', 'b',
    'a', 'b',
    'a', 'b',
    ]
data = [
    10,11,
    15,14,
    10,15
    ]
dataset = zip(ids, var, data)
print dataset

columns = ['ids', 'var', 'data']
df = pd.DataFrame(data = dataset, columns=columns)
print df

## what I want:
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator

fig = plt.figure()
ax1 = fig.add_subplot(111)
for i,ii in enumerate(ids):
    if var[i] == 'a':
        ax1.plot(i/2, data[i], 'rs', label='var a')
    else:
        ax1.plot((i-1)/2, data[i], 'bo', label='var b')
majorLocator = MultipleLocator(1)
ax1.xaxis.set_major_locator(majorLocator)
ax1.grid()
ax1.margins(0.05)
ax1.set_xlabel('ids')
ax1.set_ylabel('data')
ax1.legend(loc='best', numpoints=1)
fig.show()

如果没有很多嵌套的 for 循环,我该如何正确地执行此操作?如果我可以将 id 用作 xlabels,那将是一个加号...

非常感谢, 丹尼尔

seaborn 为您做了很多,非常灵活:

import seaborn as sns
sns.factorplot('ids', 'data', hue='var', kind='bar', data=df)

(它还重新设置绘图默认值的样式,可以更改或重置)。

如果要对数据进行子集化,请将子集作为 data 参数传递:

sns.factorplot('ids', 'data', hue='var', kind='bar', 
               data=df[df.isin({'ids':['Bob','Mary']}).any(1)])

  • 那是关闭了 sns 样式
  • 对于任何更复杂的蒙版,您需要单独设置蒙版;请参阅 pandas 文档

我不太确定你想要什么最终目标,但如果 cphlewis 建议使用 seaborn 不是你想要的,你可以尝试将你的 DataFrame 转换为多索引,然后绘制就是这样。

mi = pd.DataFrame(data=data,index=[ids,var],columns=['data'])
f, a = plt.subplots()
mi.plot(kind='bar',ax=a)

参考 this post 可能也有帮助。