2015-07-28 26 views
19

Tôi đã sau vòng lặp for:Làm cách nào để nối thêm các hàng trong một khung dữ liệu gấu trúc trong vòng lặp for?

for i in links: 
    data = urllib2.urlopen(str(i)).read() 
    data = json.loads(data) 
    data = pd.DataFrame(data.items()) 
    data = data.transpose() 
    data.columns = data.iloc[0] 
    data = data.drop(data.index[[0]]) 

Mỗi dataframe để tạo có hầu hết các cột điểm chung với những người khác nhưng không phải tất cả trong số họ. Hơn nữa, tất cả chúng đều chỉ có một hàng. Những gì tôi cần làm là thêm vào khung dữ liệu tất cả các cột riêng biệt và mỗi hàng từ mỗi khung dữ liệu được tạo bởi vòng lặp

Tôi đã thử gấu trúc tương tự hoặc tương tự nhưng không có gì có vẻ hoạt động. Bất kỳ ý tưởng? Cảm ơn.

Trả lời

20

Giả sử dữ liệu của bạn trông như thế này:

import pandas as pd 
import numpy as np 

np.random.seed(2015) 
df = pd.DataFrame([]) 
for i in range(5): 
    data = dict(zip(np.random.choice(10, replace=False, size=5), 
        np.random.randint(10, size=5))) 
    data = pd.DataFrame(data.items()) 
    data = data.transpose() 
    data.columns = data.iloc[0] 
    data = data.drop(data.index[[0]]) 
    df = df.append(data) 
print('{}\n'.format(df)) 
# 0 0 1 2 3 4 5 6 7 8 9 
# 1 6 NaN NaN 8 5 NaN NaN 7 0 NaN 
# 1 NaN 9 6 NaN 2 NaN 1 NaN NaN 2 
# 1 NaN 2 2 1 2 NaN 1 NaN NaN NaN 
# 1 6 NaN 6 NaN 4 4 0 NaN NaN NaN 
# 1 NaN 9 NaN 9 NaN 7 1 9 NaN NaN 

Sau đó, nó có thể được thay thế bằng

np.random.seed(2015) 
data = [] 
for i in range(5): 
    data.append(dict(zip(np.random.choice(10, replace=False, size=5), 
         np.random.randint(10, size=5)))) 
df = pd.DataFrame(data) 
print(df) 

Nói cách khác, không tạo thành một DataFrame mới cho mỗi hàng. Thay vào đó, hãy thu thập tất cả dữ liệu trong một danh sách các dicts, và sau đó gọi df = pd.DataFrame(data) một lần ở cuối, bên ngoài vòng lặp.

Mỗi cuộc gọi đến df.append yêu cầu phân bổ dung lượng cho một khung dữ liệu mới với một hàng bổ sung, sao chép tất cả dữ liệu từ DataFrame gốc vào DataFrame mới và sau đó sao chép dữ liệu vào hàng mới. Tất cả việc phân bổ và sao chép đó làm cho việc gọi df.append trong một vòng lặp rất không hiệu quả. Chi phí thời gian sao chép tăng theo bậc hai với số hàng. Không chỉ mã gọi-DataFrame-một lần dễ viết hơn, hiệu suất của nó sẽ tốt hơn nhiều - chi phí thời gian sao chép tăng tuyến tính với số hàng.

+2

Tôi đã thực sự ngạc nhiên về sự khác biệt hiệu suất: thêm 100 dòng 5 giá trị mất 336ms với dataframe.append (Tôi đã thử dataframe.loc [i], dường như giống nhau) Giống như giải pháp được đề xuất chỉ thực hiện 4.8ms! –

11

Có 2 lý do bạn có thể nối thêm các hàng trong vòng lặp, 1. thêm vào một df hiện có và 2. tạo một df mới.

để tạo ra một df mới, tôi nghĩ nó cũng ghi nhận rằng bạn nên thể tạo dữ liệu của bạn như một danh sách và sau đó tạo ra các khung dữ liệu:

cols = ['c1', 'c2', 'c3'] 
lst = [] 
for a in range(2): 
    lst.append([1, 2, 3]) 
df1 = pd.DataFrame(lst, columns=cols) 
df1 
Out[3]: 
    c1 c2 c3 
0 1 2 3 
1 1 2 3 

OR, Tạo dataframe với một chỉ số và sau đó thêm để nó

cols = ['c1', 'c2', 'c3'] 
df2 = pd.DataFrame(columns=cols, index=range(2)) 
for a in range(2): 
    df2.loc[a].c1 = 4 
    df2.loc[a].c2 = 5 
    df2.loc[a].c3 = 6 
df2 
Out[4]: 
    c1 c2 c3 
0 4 5 6 
1 4 5 6 

Nếu bạn muốn thêm vào một dataframe hiện tại, bạn có thể sử dụng một trong hai phương pháp trên và sau đó nối lại với nhau của df (có hoặc không có index):

df3 = df2.append(df1, ignore_index=True) 
df3 
Out[6]: 
    c1 c2 c3 
0 4 5 6 
1 4 5 6 
2 1 2 3 
3 1 2 3 

Hoặc bạn cũng có thể tạo danh sách các mục nhập từ điển và thêm vào các mục nhập như trong câu trả lời ở trên.

lst_dict = [] 
for a in range(2): 
    lst_dict.append({'c1':2, 'c2':2, 'c3': 3}) 
df4 = df1.append(lst_dict) 
df4 
Out[7]: 
    c1 c2 c3 
0 1 2 3 
1 1 2 3 
0 2 2 3 
1 2 2 3 

Sử dụng dict (zip (cols, Vals)))

lst_dict = [] 
for a in range(2): 
    vals = [7, 8, 9] 
    lst_dict.append(dict(zip(cols, vals))) 
df5 = df1.append(lst_dict) 
0

Tôi đã tạo ra một khung dữ liệu trong một vòng lặp for với sự giúp đỡ của một khung dữ liệu trống tạm thời. Bởi vì đối với mỗi lần lặp của vòng lặp, một khung dữ liệu mới sẽ được tạo ra do đó ghi đè nội dung của lần lặp trước đó.

Do đó, tôi cần chuyển nội dung của khung dữ liệu sang khung dữ liệu trống đã được tạo. Nó đơn giản như vậy. Chúng ta chỉ cần sử dụng.thêm chức năng như hình dưới đây:

temp_df = pd.DataFrame() #Temporary empty dataframe 
for sent in Sentences: 
    New_df = pd.DataFrame({'words': sent.words}) #Creates a new dataframe and contains tokenized words of input sentences 
    temp_df = temp_df.append(New_df, ignore_index=True) #Moving the contents of newly created dataframe to the temporary dataframe 

Bên ngoài vòng lặp for, bạn có thể sao chép nội dung của khung dữ liệu tạm thời vào khung dữ liệu tổng thể và sau đó xóa các khung dữ liệu tạm thời nếu bạn không cần nó

Các vấn đề liên quan