2017-01-06 9 views
0

Arbeiten mit Python Pandas 0.19.Python - initiieren leerer Datenrahmen und füllen aus einem anderen Datenrahmen

Ich möchte einen neuen Datenrahmen (df2) als Teilmenge eines vorhandenen Datenrahmens (DF1) erstellen. df1 sieht wie folgt aus:

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 

Die Logik ist:

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) 

Das Ergebnis DF2 ist in der Tat ein Datenrahmen, aber der Inhalt aller Spaltennamen von DF1 besteht. Es sieht wie folgt aus:

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 

Ich weiß, dass es wahrscheinlich auf die Umwandlung von der Liste zu Datenrahmen verwandt ist, aber ich bin mir nicht sicher, was genau ich hier fehlt. Oder gibt es einen besseren Weg, dies zu tun?

+0

Bitte 'df1.head()' und das endgültige Ergebnis, das Sie wollen. Das macht das Problem leichter verständlich. – MYGz

+1

Ich bin mir nicht sicher, was genau Sie fragen, aber es gibt viele Dinge, die angesprochen werden müssen. Verwenden Sie '.ix' nur, wenn es absolut notwendig ist. Sie sollten dafür keine Liste von Datenrahmen erstellen müssen, aber wenn Sie dies tun, sollte die letzte Zeile in 'pd.concat (df2)' geändert werden. Bitte geben Sie weitere Informationen an, da es möglich sein könnte, keine for-Schleife zu verwenden, um die Logik zu konstruieren. Auch der Name 'df2' bedeutet, dass Sie einen DataFrame haben. Verwenden Sie stattdessen etwas wie "df_list". –

+0

in der for-Schleife überprüfen Sie den Wert von loc, kann es Ihnen sagen, wenn etwas falsch ist – Shijo

Antwort

1

Per Ted Petrou, die: es Spalten b und c und nur die Zeilen, in denen Spalte a hat einen geraden Wert haben sollte Lösung ist einfach:

pd.concat(df2) 

ich durch den Datentyp von DF2 verwechselt wurde.

Aufgrund der Logik in der for-Schleife ist es unmöglich, direkt df1 mit einem Index zu wählen.

0

Wie wäre es, nur den Datenrahmen zu schneiden?

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

Dies sollte effiziente Weise als anhängt. DF1 [Komplizierte Bedingung] nimmt jedes boolesche Argument an

0

Sie können die maskierten Reihen der Pandas (tatsächlich numpys) ausnutzen.

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 

Nehmen wir an, dass df2 eine Teilmenge von df1 sein sollte:

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