如何在pandas中用重复数据填充行?

2024-06-01 09:32:49 发布

您现在位置:Python中文网/ 问答频道 /正文

在R中,将长度不等的新数据添加到数据帧时,值重复以填充数据帧:

df <- data.frame(first=c(1,2,3,4,5,6))
df$second <- c(1,2,3)

屈服:

  first second
1     1      1
2     2      2
3     3      3
4     4      1
5     5      2
6     6      3

然而,熊猫需要相同的索引长度。

我如何“填写”熊猫的重复数据,就像我可以在R?


Tags: 数据dfdataframefirstsecond屈服
3条回答

似乎没有优雅的方式。这是我刚想出的解决办法。基本上是创建一个比原始数据帧稍大的重复列表,然后左键连接它们。

import pandas
df = pandas.DataFrame(range(100), columns=['first'])
repeat_arr = [1, 2, 3]
df = df.join(pandas.DataFrame(repeat_arr * (len(df)/len(repeat_arr)+1),
    columns=['second']))

itertools的循环方法有利于重复一个常见的模式。

from itertools import cycle

seq = cycle([1, 2, 3])
df['Seq'] = [next(seq) for count in range(df.shape[0])]
import pandas as pd
import numpy as np

def put(df, column, values):
    df[column] = 0
    np.put(df[column], np.arange(len(df)), values)

df = pd.DataFrame({'first':range(1, 8)})    
put(df, 'second', [1,2,3])

收益率

   first  second
0      1       1
1      2       2
2      3       3
3      4       1
4      5       2
5      6       3
6      7       1

不是特别漂亮,但它拥有的一个“特性”是,如果数据帧的长度是重复值长度的倍数,则不必担心。np.put根据需要重复这些值。


我的第一个回答是:

import itertools as IT
df['second'] = list(IT.islice(IT.cycle([1,2,3]), len(df)))

但事实证明,这要慢得多:

In [312]: df = pd.DataFrame({'first':range(10**6)})

In [313]: %timeit df['second'] = list(IT.islice(IT.cycle([1,2,3]), len(df)))
10 loops, best of 3: 143 ms per loop

In [316]: %timeit df['second'] = 0; np.put(df['second'], np.arange(N), [1,2,3])
10 loops, best of 3: 27.9 ms per loop

相关问题 更多 >