首页 > 解决方案 > 将列的值复制到熊猫中的下几行

问题描述

我有一个数据框,其中有一个唯一列以及多个列,如下所示:

   UniqueNumber Values
0   69444108688 500
1   66023511069 100
2   53313124505 200
3   95336385161 300
4   53923124505 400
5   96498947724 250
6   38933995601 430
7   13182151675 595
8   68184277619 792
9   87329074618 800

数据框大小约为 1000,我试图抽取少量随机样本并复制“UniqueNumber”列的每四个连续值的值,其值位于每第 5 个位置。我的预期输出如下数据框

   UniqueNumber Values
0   69444108688 500
1   69444108688 100
2   69444108688 200
3   69444108688 300
4   69444108688 400
5   96498947724 250
6   96498947724 430
7   96498947724 595
8   96498947724 792
9   96498947724 800

我正在通过以下方式尝试这个。它将列数据类型更改为浮点类型。我正在寻找在熊猫中实现这一目标的任何有效方法。

下面是我的代码

df_sample =  df.sample(100)
unique_vals = df_sample['UniqueNumber'].tolist()

for i in range(0,len(unique_vals) - 1, 1):
    if i%5 !=0 :
        unique_vals[i] = np.nan

df_sample['UniqueNumber'] = unique_vals

df_sample['UniqueNumber'].ffill(axis = 0, inplace = True)

标签: python-3.xpandasdataframedata-analysis

解决方案


如果 index 是默认值RangeIndex,您可以使用整数除法5,然后使用GroupBy.transformwith GroupBy.first

df['UniqueNumber'] = df.groupby(df.index // 5)['UniqueNumber'].transform('first')

或者,如果一些通用索引值创建辅助数组:

df['UniqueNumber'] = df.groupby(np.arange(len(df)) // 5)['UniqueNumber'].transform('first')
print (df)
   UniqueNumber  Values
0   69444108688     500
1   69444108688     100
2   69444108688     200
3   69444108688     300
4   69444108688     400
5   96498947724     250
6   96498947724     430
7   96498947724     595
8   96498947724     792
9   96498947724     800

另一个想法是将具有缺失值的浮点值转换为整数

m = np.arange(len(df)) % 5 == 0
df['UniqueNumber'] = df['UniqueNumber'].where(m).astype('Int64').ffill().astype('int64')
print (df)
   UniqueNumber  Values
0   69444108688     500
1   69444108688     100
2   69444108688     200
3   69444108688     300
4   69444108688     400
5   96498947724     250
6   96498947724     430
7   96498947724     595
8   96498947724     792
9   96498947724     800

推荐阅读