我正在尝试将值分配给多索引数据帧中每个级别零组的第一行。前几行是日期和时间,并不是每一行的通用值。我已附上代码示例,以重现最小的数据帧。
import pandas as pd
import numpy as np
np.random.seed(123)
arrays = [np.array(["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"]),np.array(["one", "two", "not_one", "two", "not_one_one", "two", "not_not_one", "two"]),]
df = pd.DataFrame(np.random.randn(8,4), index=arrays)
我尝试过分配带有和不带有列索引的值。
df.loc[[df.groupby(level=0).nth(0)],'0'] = 100
xy = list(set(df.index.get_level_values(level=0)))
for ind1 in xy:
df.loc[(ind1, df.iloc[0]),'0'] = 100
我已经尝试过大约100种不同的iloc变体,但是没有运气,我已经尝试过xs
df.groupby(level=0).xs(0, level=1) = 100
我试过了
df.loc[df.groupby(level=0).nth(0)] = 100
也,
df.groupby(level=0).nth(0) = 100
我已经花了几个小时了,但仍然一无所获。任何帮助,将不胜感激。我要从这里开始:
0 1 2 3
bar one -1.085631 0.997345 0.282978 -1.506295
two -0.578600 1.651437 -2.426679 -0.428913
baz not_one 1.265936 -0.866740 -0.678886 -0.094709
two 1.491390 -0.638902 -0.443982 -0.434351
foo not_one_one 2.205930 2.186786 1.004054 0.386186
two 0.737369 1.490732 -0.935834 1.175829
qux not_not_one -1.253881 -0.637752 0.907105 -1.428681
two -0.140069 -0.861755 -0.255619 -2.798589
对此:
0 1 2 3
bar one 100 0.997345 0.282978 -1.506295
two -0.578600 1.651437 -2.426679 -0.428913
baz not_one 100 -0.866740 -0.678886 -0.094709
two 1.491390 -0.638902 -0.443982 -0.434351
foo not_one_one 100 2.186786 1.004054 0.386186
two 0.737369 1.490732 -0.935834 1.175829
qux not_not_one 100 -0.637752 0.907105 -1.428681
two -0.140069 -0.861755 -0.255619 -2.798589
您可以使用groupby
+cumcount
创建每个level=0
组的顺序计数器,然后使用布尔索引withloc
更新0
计数器所在的列中的值0
:
df.loc[df.groupby(level=0).cumcount().eq(0), 0] = 100
0 1 2 3
bar one 100.000000 0.997345 0.282978 -1.506295
two -0.578600 1.651437 -2.426679 -0.428913
baz not_one 100.000000 -0.866740 -0.678886 -0.094709
two 1.491390 -0.638902 -0.443982 -0.434351
foo not_one_one 100.000000 2.186786 1.004054 0.386186
two 0.737369 1.490732 -0.935834 1.175829
qux not_not_one 100.000000 -0.637752 0.907105 -1.428681
two -0.140069 -0.861755 -0.255619 -2.798589
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句