2015-06-18 42 views

Odpowiedz

27

ja bym concat użyciu konstruktor DataFrame:

In [23]: 
df = pd.DataFrame(columns=['A']) 
df 

Out[23]: 
Empty DataFrame 
Columns: [A] 
Index: [] 

In [24]:  
pd.concat([df,pd.DataFrame(columns=list('BCD'))]) 

Out[24]: 
Empty DataFrame 
Columns: [A, B, C, D] 
Index: [] 

Więc przekazując listę zawierające oryginalny plik df i nowy z kolumnami, które chcesz dodać, spowoduje to zwrócenie nowego pliku df z dodatkowymi kolumnami.

+0

Dzięki, że to możliwe, że czegoś mi brakuje, ale dodałem 'pd.concat ([df, pd.DataFrame (kolumny = list ('BCD'))]) '- to nic nie robi. Czy to dlatego, że używam 'df = pd.read_csv', a nie' df = pd.DataFrame'? – Winterflags

+2

Musisz przypisać wynik concat, więc 'df = pd.concat ([df, pd.DataFrame (columns = list ('BCD'))])' – EdChum

+0

Dzięki, to działało. Czy mogę dołączyć kolumny do ostatniej kolumny? Nowe kolumny zostaną dodane na początku. Wygląda na to, że concat dokonuje automatycznej zmiany kolejności, ponieważ moje oryginalne kolumny również są przenoszone. – Winterflags

33

Można użyć df.reindex dodać nowe kolumny:

In [18]: df = pd.DataFrame(np.random.randint(10, size=(5,1)), columns=['A']) 

In [19]: df 
Out[19]: 
    A 
0 4 
1 7 
2 0 
3 7 
4 6 

In [20]: df.reindex(columns=list('ABCD')) 
Out[20]: 
    A B C D 
0 4 NaN NaN NaN 
1 7 NaN NaN NaN 
2 0 NaN NaN NaN 
3 7 NaN NaN NaN 
4 6 NaN NaN NaN 

reindex powróci nowy DataFrame z kolumny pojawiają się w kolejności, w jakiej zostały wymienione:

In [31]: df.reindex(columns=list('DCBA')) 
Out[31]: 
    D C B A 
0 NaN NaN NaN 4 
1 NaN NaN NaN 7 
2 NaN NaN NaN 0 
3 NaN NaN NaN 7 
4 NaN NaN NaN 6 

Sposób reindex jako fill_value Parametr również:

In [22]: df.reindex(columns=list('ABCD'), fill_value=0) 
Out[22]: 
    A B C D 
0 4 0 0 0 
1 7 0 0 0 
2 0 0 0 0 
3 7 0 0 0 
4 6 0 0 0 
+0

Po eksperymentach z umiarkowanie dużą ramką danych (~ 2,5k wierszy dla kolumn 80k), a to rozwiązanie wydaje się być o rząd wielkości szybszy od akceptowanego. BTW czy istnieje powód, dla którego to konkretne polecenie nie akceptuje parametru "inplace = True"? df = df.reindex (...) wydaje się zużywać sporo pamięci RAM. –

+1

@MarcoSpinaci: Zalecam, aby nigdy nie używać 'inplace = True'.Nie robi tego, co większość ludzi uważa. Pod maską, zawsze tworzona jest całkowicie nowa DataFrame, a następnie dane z nowej DataFrame są kopiowane do oryginalnej DataFrame. To nie zapisuje żadnej pamięci. Tak więc 'inplace = True' jest opatrunkiem bez substancji, a ponadto jest myląco nazwany. Nie sprawdziłem kodu, ale spodziewam się, że 'df = df.reindex (...)' wymaga co najmniej 2x pamięci wymaganej dla 'df', i oczywiście więcej, gdy' reindex' jest używany do rozszerzenia liczby wydziwianie. – unutbu

3

Jeśli nie chcą przepisać nazwę starych kolumn, to można użyć REINDEX:

df.reindex(columns=[*df.columns.tolist(), 'new_column1', 'new_column2'], fill_value=0) 

Pełny przykład:

In [1]: df = pd.DataFrame(np.random.randint(10, size=(3,1)), columns=['A']) 

In [1]: df 
Out[1]: 
    A 
0 4 
1 7 
2 0 

In [2]: df.reindex(columns=[*df.columns.tolist(), 'col1', 'col2'], fill_value=0) 
Out[2]: 

    A col1 col2 
0 1  0  0 
1 2  0  0 

A jeśli masz już listę z nazwami kolumn:

In [3]: my_cols_list=['col1','col2'] 

In [4]: df.reindex(columns=[*df.columns.tolist(), *my_cols_list], fill_value=0) 
Out[4]: 
    A col1 col2 
0 1  0  0 
1 2  0  0 
Powiązane problemy