2014-01-11 36 views
8

在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中一樣?

回答

5

似乎沒有優雅的方式。這是我剛纔想到的解決方法。基本上創建一個比原始數據框更大的重複列表,然後離開它們。

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'])) 
+0

+1。我喜歡這種加入方式。 –

2

您尋找的解決方案有多普遍?我試圖使這個少一點硬編碼:

import numpy as np 
import pandas 

df = pandas.DataFrame(np.arange(1,7), columns=['first']) 

base = [1, 2, 3] 
df['second'] = base * (df.shape[0]/len(base)) 
print(df.to_string()) 


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

請注意,第二列分配只有3(不是6)值。 – Arun

+0

「重複數據」不是重複的列。 – Amyunimus

+0

哎呦@Amyunimus看我編輯。 –

2
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 
+0

這很好 - 雖然在我的特殊情況下,如果他們不適合長度,我不希望數字填入,但+1更常用。 – Amyunimus

0

在我來說,我需要重複的值不知道的長度子列表,即檢查每個組的長度。 這是我的解決方案:

import numpy as np 
import pandas 

df = pandas.DataFrame(['a','a','a','b','b','b','b'], columns=['first']) 

list = df.groupby('first').apply(lambda x: range(len(x))).tolist() 
loop = [val for sublist in list for val in sublist] 
df['second']=loop 

df 
    first second 
0  a  0 
1  a  1 
2  a  2 
3  b  0 
4  b  1 
5  b  2 
6  b  3 
3

循環方法從itertools是良好的重複的通用模式。

from itertools import cycle 

seq = cycle([1, 2, 3]) 
df['Seq'] = [next(seq) for count in range(df.shape[0])] 
+0

pythonic。 +1投票... – su79eu7k