如何迭代 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 可能也有帮助。
我是 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 可能也有帮助。