在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中一樣?
在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中一樣?
似乎沒有優雅的方式。這是我剛纔想到的解決方法。基本上創建一個比原始數據框更大的重複列表,然後離開它們。
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']))
您尋找的解決方案有多普遍?我試圖使這個少一點硬編碼:
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
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
這很好 - 雖然在我的特殊情況下,如果他們不適合長度,我不希望數字填入,但+1更常用。 – Amyunimus
在我來說,我需要重複的值不知道的長度子列表,即檢查每個組的長度。 這是我的解決方案:
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
循環方法從itertools是良好的重複的通用模式。
from itertools import cycle
seq = cycle([1, 2, 3])
df['Seq'] = [next(seq) for count in range(df.shape[0])]
pythonic。 +1投票... – su79eu7k
+1。我喜歡這種加入方式。 –