numpy Pandas:基于另一列中的非重复值创建包含重复值的新列

rqqzpn5f  于 2023-01-13  发布在  其他
关注(0)|答案(2)|浏览(132)

我有一个 Dataframe ,以下列格式如下:

df = pd.DataFrame(data={
  'value': [123, 456, 789, 111, 121, 34523, 4352, 45343, 623] 
  'repeatVal': ['NaN', 2, 'NaN', 'NaN', 3, 'NaN', 'NaN', 'NaN', 'NaN'],
})

我想创建一个新列,它从'value'中获取值,并从'repeatVal'向下重复它的次数,这样输出看起来就像'result':

df = pd.DataFrame(data={
  'value': [123, 456, 789, 111, 121, 34523, 4352, 45343, 623] 
  'repeatVal': ['NaN', 2, 'NaN', 'NaN', 3, 'NaN', 'NaN', 'NaN', 'NaN'],
  'result': ['NaN', 456, 456, 'NaN', 121, 121, 121, 'NaN', 'NaN']
})

需要说明的是,我不想复制行,我只想创建一个新列,其中的值重复n次,n在不同的列中指定。列'repeatVals'的格式是这样的,即永远不会有重叠--在'repeatVals'中的重复指示符之间总是有足够的NaN值
我已经阅读了np.repeat和np.tile的文档,但这些文档似乎没有解决这个问题。

vuktfyat

vuktfyat1#

使用groupby.cumcount作为遮罩的一个选项:

df = df.replace('NaN', float('nan'))

m1 = df['repeatVal'].notna()
m2 = df.groupby(m1.cumsum()).cumcount().lt(df['repeatVal'].ffill())
df['result'] = df['value'].where(m1).ffill().where(m2)

输出:

value  repeatVal  result
0    123        NaN     NaN
1    456        2.0   456.0
2    789        NaN   456.0
3    111        NaN     NaN
4    121        3.0   121.0
5  34523        NaN   121.0
6   4352        NaN   121.0
7  45343        NaN     NaN
8    623        NaN     NaN

中间体:

value  repeatVal  result     m1  m1.cumsum()  cumcount  cumcount < repeatVal.ffill()  value/masked/ffill
0    123        NaN     NaN  False            0         0                         False                 NaN
1    456        2.0   456.0   True            1         0                          True               456.0
2    789        NaN   456.0  False            1         1                          True               456.0
3    111        NaN     NaN  False            1         2                         False               456.0
4    121        3.0   121.0   True            2         0                          True               121.0
5  34523        NaN   121.0  False            2         1                          True               121.0
6   4352        NaN   121.0  False            2         2                          True               121.0
7  45343        NaN     NaN  False            2         3                         False               121.0
8    623        NaN     NaN  False            2         4                         False               121.0
wn9m85ua

wn9m85ua2#

下面是使用index.repeat的方法

((v := df.loc[df.index.repeat(df['repeatVal'].fillna(0)),'value'])
.set_axis(v.groupby(v).cumcount() + v.index))

输出:

相关问题