Python 如何根据熊猫中的列填充缺少的值?

Python 如何根据熊猫中的列填充缺少的值?,python,pandas,numpy,Python,Pandas,Numpy,我在熊猫中有这个数据帧: 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: n t v a 0 10

我在熊猫中有这个数据帧:

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

   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

看来你造错了。通常自动读入NaN或指定它们。如果顶部有
import numpy as np
,则可以通过
np.NaN
手动输入NaN。或者,pandas在内部存储numpy,您可以通过pandas.np.Nan

获得一个Nan,如果在
df
之前没有
Nan
,则可以使用-create
多索引
,然后,
t
中的
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的另一个解决方案是,方法:

但是如果一些
NaN
值需要
groupby
loc
by
n
列的值:

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   

计划

  • 获取列
    'n'
    的唯一值。我们将使用它来重新索引
  • 我们将把
    f
    应用于
    't'
    列各组中的组,通过
    idx
    重新编制索引将确保我们得到针对每组唯一
    't'
    idx
    的所有元素
  • 我们设置索引,以便在一点时间内
    reindex


据我所知,您希望
“n”
中的每个值在按
“t”
分组的子组中平均分布。我还希望这些
“n”
不能在这些子组中重复

考虑到这些假设是正确的,这似乎是这个用例的一个很好的选择。这里,
“n”
下的值将构成列名,
“t”
将是分组索引,
DF
的内容将由
“v”
下的值填充。稍后将
DF
堆叠起来,同时保留
NaN
条目,并用
.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

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
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
df1 = pd.pivot_table(df, "v", "t", "n", "first").stack(dropna=False).reset_index(name="v")
df1.loc[df1['v'].isnull(), "t"] = np.nan