Pandas检查其他列值之间的列值是否为

时间:2017-05-23 11:03:06

标签: python python-3.x pandas matplotlib dataframe

我是新手,我相信这是一个我不了解的简单方法,请提前感谢您的帮助。

我已经获得了过去10年中每一天最高和最低销售团队表现的历史最低和最高销售数字。 2016年我也有同样的事情(下面的例子数据)。

              hist_min  hist_max   2016_min  2016_max
Day_of_Year
1               1000    10000         898     9000
2                234      896         300     1000
3               1254    23666        1000    24000
4                930    78999        1000     1050
5                278    74588         300     5000

最终目标是在matplotlib中绘制此数据,但我只想从2016_min列获取低于hist_min值的值,同样只有2016_max列的值超过hist_max列。数据看起来像这样:

              hist_min  hist_max   2016_min  2016_max
Day_of_Year
1               1000    10000         898     NULL
2                234      896        NULL     1000
3               1254    23666        1000    24000
4                930    78999        NULL     NULL
5                278    74588        NULL     NULL

我把' NULL'在那里代表空值,Nan可能会更好但我不知道matplot lib是否可以处理' Nan'数字与否...这是下一步,所以我很快就会发现。

提前感谢您的帮助, 我

2 个答案:

答案 0 :(得分:1)

mask与布尔掩码一起使用,如果NaN s,则返回NULLNoneTrue

print (df['2016_min'] > df['hist_min'])
Day_of_Year
1    False
2     True
3    False
4     True
5     True
dtype: bool

df['2016_min'] = df['2016_min'].mask(df['2016_min'] > df['hist_min'])
df['2016_max'] = df['2016_max'].mask(df['2016_max'] < df['hist_max'])
print (df)
             hist_min  hist_max  2016_min  2016_max
Day_of_Year                                        
1                1000     10000     898.0       NaN
2                 234       896       NaN    1000.0
3                1254     23666    1000.0   24000.0
4                 930     78999       NaN       NaN
5                 278     74588       NaN       NaN
df['2016_min'] = df['2016_min'].mask(df['2016_min'] > df['hist_min'], 'NULL')
df['2016_max'] = df['2016_max'].mask(df['2016_max'] < df['hist_max'], 'NULL')
print (df)
             hist_min  hist_max 2016_min 2016_max
Day_of_Year                                      
1                1000     10000      898     NULL
2                 234       896     NULL     1000
3                1254     23666     1000    24000
4                 930     78999     NULL     NULL
5                 278     74588     NULL     NULL
df['2016_min'] = df['2016_min'].mask(df['2016_min'] > df['hist_min'], None)
df['2016_max'] = df['2016_max'].mask(df['2016_max'] < df['hist_max'], None)
print (df)
             hist_min  hist_max 2016_min 2016_max
Day_of_Year                                      
1                1000     10000      898     None
2                 234       896     None     1000
3                1254     23666     1000    24000
4                 930     78999     None     None
5                 278     74588     None     None

答案 1 :(得分:1)

您可以按条件

索引数据框
 df1 = df[df["2016_max"] > df["hist_max"]]

然后可以使用matplotlib轻松绘制。

u = u"""Day_of_Year      hist_min  hist_max   2016_min  2016_max
1               1000    10000         898     9000
2                234      896         300     1000
3               1254    23666        1000    24000
4                930    78999        1000     1050
5                278    74588         300     5000"""

import io
import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv(io.StringIO(u), index_col=0, delim_whitespace=True)

df1 = df[df["2016_max"] > df["hist_max"]]
df2 = df[df["2016_min"] < df["hist_min"]]

fig, ax = plt.subplots()
ax.scatter(df1.index, df1["2016_max"], label="max. 2016")
ax.scatter(df2.index, df1["2016_min"], label="min. 2016")

plt.legend()
plt.show()

enter image description here