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
byn
列的值:
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