我有一个数据帧,其中包含一些带有日期和国家信息的数字:
df = pd.DataFrame(data={"day": ['2021-01-01', '2021-01-01', '2021-01-02', '2021-01-02', '2021-01-03'],
"country": ["France", "Brazil", "Brazil", "Cuba", "France"],
"n": [1, 2, 3, 4, 5]
})
这看起来像:
day country n
0 2021-01-01 France 1
1 2021-01-01 Brazil 2
2 2021-01-02 Brazil 3
3 2021-01-02 Cuba 4
4 2021-01-03 France 5
我想计算一些统计数据,以监控我在2021-01-03收到的数据是否包含一些错误,为此,我需要将1月3日收到的数据与之前数据的平均值(例如(进行比较。
所以我想添加一些行,这表明我在1月3日没有得到巴西和古巴的任何信息,这是我想要的输出:
country day n
0 France 2021-01-03 5.0
1 France 2021-01-01 1.0
2 Brazil 2021-01-01 2.0
3 Brazil 2021-01-02 3.0
4 Cuba 2021-01-02 4.0
5 Brazil 2021-01-03 NaN
6 Cuba 2021-01-03 NaN
这是我尝试过的代码,但我感觉不太";熊猫喜欢";,我相信Pandas中有一个内置的方法,或者至少有一个更好的方法可以为最近的行添加数据:
countries = pd.DataFrame({"country": df.country.unique()})
recent_date = pd.DataFrame({"day":[df.day.max()]})
countries.merge(recent_date, how="cross").merge(df, how="outer")
这就是结果:
country day n
0 France 2021-01-03 5.0
1 Brazil 2021-01-03 NaN
2 Cuba 2021-01-03 NaN
3 France 2021-01-01 1.0
4 Brazil 2021-01-01 2.0
5 Brazil 2021-01-02 3.0
6 Cuba 2021-01-02 4.0
(附言:我对这篇文章的标题持开放态度(
想法是过滤掉所有没有最长天数的唯一国家,并使用numpy.setdiff1d
:添加到原始国家
d = df.day.max()
c = np.setdiff1d(df.country.unique(), df.loc[df['day'].eq(d), 'country'])
df = df.append(pd.DataFrame({'country':c, 'day': d}), ignore_index=True)
print (df)
day country n
0 2021-01-01 France 1.0
1 2021-01-01 Brazil 2.0
2 2021-01-02 Brazil 3.0
3 2021-01-02 Cuba 4.0
4 2021-01-03 France 5.0
5 2021-01-03 Brazil NaN
6 2021-01-03 Cuba NaN
第一个想法,有点复杂:
df['day'] = pd.to_datetime(df['day'] )
c = df.loc[df['day'].eq(df['day'].max()), 'country']
df = df.append(df[['country']].drop_duplicates()
.assign(day = df['day'].max())
.query("country not in @c"), ignore_index=True)
print (df)
day country n
0 2021-01-01 France 1.0
1 2021-01-01 Brazil 2.0
2 2021-01-02 Brazil 3.0
3 2021-01-02 Cuba 4.0
4 2021-01-03 France 5.0
5 2021-01-03 Brazil NaN
6 2021-01-03 Cuba NaN