2017-01-06 40 views
0

使用python熊貓0.19。Python - 啓動空數據框並從另一個數據框填充

我想創建一個新的數據幀(df2)作爲現有數據幀(df1)的子集。 DF1看起來是這樣的:

In [1]: df1.head() 
Out [1]: 
    col1_name col2_name col3_name 
0   23   42   55 
1   27   55   57 
2   52   20   52 
3   99   18   53 
4   65   32   51 

的邏輯是:

df2 = [] 

for i in range(0,N): 
    loc = some complicated logic 
    df1_sub = df1.ix[loc,] 
    df2.append(df1_sub) 

df2 = pd.DataFrame.from_records(df2) 

結果DF2確實是一個數據框,但內容全部由DF1的列名。它看起來像這樣:

In [2]: df2.head() 
Out [2]: 
    col1_name col2_name col3_name 
0 col1_name col2_name col3_name 
1 col1_name col2_name col3_name 
2 col1_name col2_name col3_name 
3 col1_name col2_name col3_name 
4 col1_name col2_name col3_name 

我知道這可能與從列表中數據幀的轉換,但我不知道究竟什麼我失蹤這裏。或者有更好的方法來做到這一點?

+0

請包括'df1.head()'和你想要的最終結果。這使問題更易於理解。 – MYGz

+1

我不確定你在問什麼,但有很多事情需要解決。除非絕對必要,否則不要使用'.ix'。你不應該創建一個數據框列表來做到這一點,但如果你這樣做,最後一行應該改爲'pd.concat(df2)'。請提供更多信息,因爲可能不使用for循環來構建邏輯。另外名稱'df2'意味着你有一個DataFrame。改爲使用'df_list'。 –

+0

在for循環中檢查loc的值,它可能告訴你是否有什麼問題 – Shijo

回答

1

按照特德·彼得魯中,解決辦法很簡單:

pd.concat(df2) 

我被df2的數據類型弄糊塗了。

鑑於for循環內的邏輯,使用某個索引直接選擇df1是不可能的。

0

剛分片數據框怎麼樣?

import pandas as pd 
DF1 = pd.DataFrame() 
DF1['x'] = ['a','b','c','a','c','b'] 
DF1['y'] = [1,3,2,-1,-2,-3] 

DF2 = DF1[[(x == 'a' and y > 0) for x,y in zip(DF1['x'], DF1['y'])]] 

這應該比追加效率更高效。 DF1 [複雜條件]採取任何布爾論證

0

你可以利用熊貓'(實際上是numpy的)被屏蔽的數組。

import pandas as pd 

df1 = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'b': ['a', 'b', 'c', 'd', 'e'], 
        'c': [10, 11, 12, 13, 14]}) 

#  a b c 
# 0 1 a 10 
# 1 2 b 11 
# 2 3 c 12 
# 3 4 d 13 
# 4 5 e 14 

讓我們假設df2應該是df1一個子集:它應該有列bc,只有行,其中列a有偶數值:

df2 = df1[df1['a'] % 2 == 0][['b', 'c']] 
# b c 
# 1 b 11 
# 3 d 13