Pandas透视表值循环

时间:2017-08-19 02:56:41

标签: python pandas

我有一个数据集,其中包含每个国家/地区每个库存的特定日期(d1,d2,d3等)的日期和数据点。每个国家的一些股票缺少一些数据点,我想用其他国家的股票平均值替换它们

date  stock     d1  d2 d3 country
12.94 xyz corp  12   3  4 US
12.95 xyz corp  13 NaN  1 US
12.95 123 corp   3   4 12 US
12.94 abc corp   1   3  5 CA
12.94 abc corp NaN   3  4 CA

因此,在上述数据中,12.95的xyz点d2需要被美国境内d2的平均值替换为12.95

我很感激有关如何做到这一点的任何见解。我创建了一个独特日期的索引,并计划使用数据透视表,其中值迭代各种数据点,如d1,d2等

cnt_avgs=rawdt.pivot_table(values=["d1",index=["country","],aggfunc=np.mean)

2 个答案:

答案 0 :(得分:0)

我不确定这是否是你要找的东西。但您可以遍历所有NaN列,然后迭代缺失值行,并使用numpy.mean和条件pandas切片替换缺少的值:

将列表转换为pandas数据帧:

df = pd.DataFrame(dt[1:], columns=dt[0])

检查并迭代具有NaN值的列。然后,对于具有NaN的列,迭代行并使用numpy mean函数和pandas条件切片更改数据:

for col in df.columns[df.isnull().any()]:
    for row in df[df[col].isnull()].iterrows():
        df.loc[row[0], col] = np.mean(df[(df['date'] == row[1]['date']) & (df['country'] == row[1]['country'])][col])

答案 1 :(得分:0)

IIUC,使用groupbyfillna

df.groupby(['date','country'],as_index=False)\
  .apply(lambda x: x.fillna(x.mean()))\
  .reset_index(drop=True)

输出:

    date     stock    d1   d2  d3 country
0  12.94  abc corp   1.0  3.0   5      CA
1  12.94  abc corp   1.0  3.0   4      CA
2  12.94  xyz corp  12.0  3.0   4      US
3  12.95  xyz corp  13.0  4.0   1      US
4  12.95  123 corp   3.0  4.0  12      US