繁体   English   中英

用必须在另一列的特定行上计算的公式填充值为0或NaN的Pandas数据框行

[英]Fill Pandas dataframe rows, whose value is a 0 or NaN, with a formula that have to be calculated on specific rows of another column

我有一个dateframe其中的“价格”列中的值取决于双方在“量”的价值观和“年”列是不同的。 例如,对于等于2的数量,我在2017年的价格等于2,在2018年的价格为4。我想用2018年的值填充2019年的行,这些行的值为0和NaN。

df = pd.DataFrame({
    'quantity': pd.Series([1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]),
    'year': pd.Series([2017,2017,2017,2017,2017,2017,2017,2017,2017,2018,2018,2018,2018,2018,2018,2018,2018,2018,2019,2019,2019,2019,2019,2019,2019,2019,2019,]),
    'price': pd.Series([1,2,3,4,5,6,7,8,9,2,4,6,8,10,12,14,16,18,np.NaN,np.NaN,0,0,np.NaN,0,np.NaN,0,np.NaN])
})

如果我应该计算2017年至2018年之间的平均值 ,而不是从2018年取值,该怎么办?

我试图重新适应这个问题,将其应用于第一种情况(以应用2018年的数据),但是它不起作用:

df['price'][df['year']==2019].fillna(df['price'][df['year'] == 2018], inplace = True)

请你帮助我好吗?

预期输出应为类似于以下内容的数据框:

具有2018年值的DF

df = pd.DataFrame({
    'quantity': pd.Series([1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]),
    'year': pd.Series([2017,2017,2017,2017,2017,2017,2017,2017,2017,2018,2018,2018,2018,2018,2018,2018,2018,2018,2019,2019,2019,2019,2019,2019,2019,2019,2019,]),
    'price': pd.Series([1,2,3,4,5,6,7,8,9,2,4,6,8,10,12,14,16,18,2,4,6,8,10,12,14,16,18])
})

Df值是2017年至2018年之间的平均值

df = pd.DataFrame({
    'quantity': pd.Series([1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]),
    'year': pd.Series([2017,2017,2017,2017,2017,2017,2017,2017,2017,2018,2018,2018,2018,2018,2018,2018,2018,2018,2019,2019,2019,2019,2019,2019,2019,2019,2019,]),
    'price': pd.Series([1,2,3,4,5,6,7,8,9,2,4,6,8,10,12,14,16,18,1.5,3,4.5,6,7.5,9,10.5,12,13.5])
})

这是20172018的一种填充方式。 首先按数量对上一年的数据进行分组,然后加上平均值:

m = df[df.year.isin([2017, 2018])].groupby('quantity').price.mean()    

使用set_indexquantity列设置为索引,将0s替换为NaNs并使用fillna ,该方法还接受字典根据索引映射值:

ix = df[df.year.eq(2019)].index
df.loc[ix, 'price'] = (df.loc[ix].set_index('quantity').price
                        .replace(0, np.nan).fillna(m).values)

    quantity  year  price
0          1  2017    1.0
1          2  2017    2.0
2          3  2017    3.0
3          4  2017    4.0
4          5  2017    5.0
5          6  2017    6.0
6          7  2017    7.0
7          8  2017    8.0
8          9  2017    9.0
9          1  2018    2.0
10         2  2018    4.0
11         3  2018    6.0
12         4  2018    8.0
13         5  2018   10.0
14         6  2018   12.0
15         7  2018   14.0
16         8  2018   16.0
17         9  2018   18.0
18         1  2019    1.5
19         2  2019    3.0
20         3  2019    4.5
21         4  2019    6.0
22         5  2019    7.5
23         6  2019    9.0
24         7  2019   10.5
25         8  2019   12.0
26         9  2019   13.5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM