如何在Pandas中基于列填充缺失值?

3

i have this dataframe in pandas:

df = pandas.DataFrame({
        "n": ["a", "b", "c", "a", "b", "x"],
        "t": [0, 0, 0, 1, 1, 1],
        "v": [10,20,30,40,50,60]
    })

如何填充缺失的数值,使得每个列“t”的数值在列“n”中具有相同的条目?也就是说,每个“t”值都应该有“a, b, c, x”的条目,如果它们不存在则记录为“NaN”。请保留HTML标记。
   n  t   v
   a  0  10
   b  0  20
   c  0  30
   x  NaN NaN
   a  1  40
   b  1  50
   c  NaN NaN
   x  1  60
4个回答

3

计划

  • 获取列'n'的唯一值。我们将使用这个值进行重新索引。
  • 在每个't'列的组内应用f函数,重新索引为idx,以确保每个唯一't'的组中都有idx的所有元素。
  • 设置索引,以便稍后进行重新索引。

idx = df.n.unique()
f = lambda x: x.reindex(idx)
df.set_index('n').groupby('t', group_keys=False).apply(f).reset_index()

   n    t     v
0  a  0.0  10.0
1  b  0.0  20.0
2  c  0.0  30.0
3  x  NaN   NaN
4  a  1.0  40.0
5  b  1.0  50.0
6  c  NaN   NaN
7  x  1.0  60.0

2
据我所了解,您希望将 "n" 中的每个值平均分配到由 "t" 分组的子组中。同时,这些子组中不能重复出现相同的 "n" 值。
如果以上假设成立,可以考虑使用 pd.pivot_table 来解决这个问题。在这种情况下,"n" 中的值将构成列名,"t" 将作为索引进行分组,DF 的内容将被 "v" 中的值填充。稍后,保留 NaN 条目并堆叠 DF,使用 .loc 访问器填充其相应单元格中的 "t"
df1 = pd.pivot_table(df, "v", "t", "n", "first").stack(dropna=False).reset_index(name="v")
df1.loc[df1['v'].isnull(), "t"] = np.nan

enter image description here


1

如果在 df 中没有 NaN,则可以创建 MultiIndex,然后使用 reindext 中的 NaN 由列 v 设置:

cols = ["n", "t"]
df1 = df.set_index(cols)
mux = pd.MultiIndex.from_product(df1.index.levels, names=cols)
df1 = df1.reindex(mux).sort_index(level=[1,0]).reset_index()
df1['t'] = df1['t'].mask(df1['v'].isnull())
print (df1)
   n    t     v
0  a  0.0  10.0
1  b  0.0  20.0
2  c  0.0  30.0
3  x  NaN   NaN
4  a  1.0  40.0
5  b  1.0  50.0
6  c  NaN   NaN
7  x  1.0  60.0

添加 NaN 的另一种解决方案是使用 unstackstack 方法:

cols = ["n", "t"]
df1 = df.set_index(cols)['v'].unstack().stack(dropna=False)
df1 = df1.sort_index(level=[1,0]).reset_index(name='v')
df1['t'] = df1['t'].mask(df1['v'].isnull())
print (df1)
    n    t     v
0  a  0.0  10.0
1  b  0.0  20.0
2  c  0.0  30.0
3  x  NaN   NaN
4  a  1.0  40.0
5  b  1.0  50.0
6  c  NaN   NaN
7  x  1.0  60.0

但是如果一些NaN值需要通过uniquen列值进行groupbyloc:

df = pd.DataFrame({"n": ["a", "b", "c", "a", "b", "x"], 
                       "t": [0, 0, 0, 1, 1, 1], 
                       "v": [10,20,30,40,50,np.nan]})
print (df)
   n  t     v
0  a  0  10.0
1  b  0  20.0
2  c  0  30.0
3  a  1  40.0
4  b  1  50.0
5  x  1   NaN

df1 = df.set_index('n')
        .groupby('t', group_keys=False)
        .apply(lambda x: x.loc[df.n.unique()])
        .reset_index()

print (df1)
   n    t     v
0  a  0.0  10.0
1  b  0.0  20.0
2  c  0.0  30.0
3  x  NaN   NaN
4  a  1.0  40.0
5  b  1.0  50.0
6  c  NaN   NaN
7  x  1.0   NaN   

df1 = df.groupby('t', group_keys=False)
        .apply(lambda x: x.set_index('n').loc[df.n.unique()])
        .reset_index()
print (df1)
   n    t     v
0  a  0.0  10.0
1  b  0.0  20.0
2  c  0.0  30.0
3  x  NaN   NaN
4  a  1.0  40.0
5  b  1.0  50.0
6  c  NaN   NaN
7  x  1.0   NaN

0

看起来你的构建方式有问题。通常 NaN 会自动读取或者你可以指定它们。如果你在顶部导入了 import numpy as np,你可以通过 np.nan 手动输入 NaN。另外,pandas 内部存储 numpy,你也可以通过 pandas.np.nan 获取 NaN。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接