我在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
:
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
答案 0 :(得分:2)
计划
'n'
的唯一值。我们将reindex
用于f
应用于每个列't'
组中的我们的群组idx
重新编制索引将确保我们获得针对每个群组的idx
所有元素独特的't'
reindex
一点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
答案 1 :(得分:1)
如果df
之前NaN
之前没有MultiIndex
,则可以使用NaN
然后reindex
,t
中设置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
:
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的另一种解决方案是unstack
,stack
方法:
NaN
但是,如果某些groupby
值需要loc
n
unique
个值为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
**\bin\$(BuildConfiguration)\*.dll
答案 2 :(得分:1)
据我所知,您希望"n"
中的每个值均匀分布在按"t"
分组的子组中。我也希望那些"n"
不能在这些子组中重复。
考虑到这些假设是正确的,pd.pivot_table
似乎是这个用例的一个很好的选择。此处,"n"
下的值将构成列名称,"t"
将成为分组索引,DF
的内容将由"v"
下的值填充。稍后堆叠DF
,同时保留NaN
个条目,并使用"t"
访问者填充.loc
中的相应单元格。
df1 = pd.pivot_table(df, "v", "t", "n", "first").stack(dropna=False).reset_index(name="v")
df1.loc[df1['v'].isnull(), "t"] = np.nan
答案 3 :(得分:0)
好像你错了。通常情况下会自动读入NaN或指定它们。如果您的np.nan
位于顶部,则可以import numpy as np
手动输入NaN&#39}。或者,熊猫在内部存储numpy,你可以通过pandas.np.nan