我是新手,我相信这是一个我不了解的简单方法,请提前感谢您的帮助。
我已经获得了过去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'数字与否...这是下一步,所以我很快就会发现。
提前感谢您的帮助, 我
答案 0 :(得分:1)
将mask
与布尔掩码一起使用,如果NaN
s,则返回NULL
,None
或True
:
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()