2015-10-13 21 views
6

Mam niektóre dane próbuję zorganizować w DataFrame w Pandas. Próbowałem zrobić każdy wiersz jako Series i dołączyć go do DataFrame. I znaleziono sposób, aby to zrobić przez dołączenie Series do pustej list i następnie przekształcając list z Series Do DataFrameCzy można dołączyć Serie do wierszy DataFrame bez tworzenia listy?

np DF = DataFrame([series1,series2],columns=series1.index)

Ten krok list do DataFrame wydaje się być przesadny. Sprawdziłem kilka przykładów tutaj, ale żaden z Series nie zachował etykiet Index od Series, aby używać ich jako etykiet kolumn.

Moja długa droga, gdzie kolumny są id_names i wiersze są type_names: enter image description here

to możliwe, aby dołączyć szeregowo rzędów DataFrame bez dokonywania listę w pierwszej kolejności?

#!/usr/bin/python 

DF = DataFrame() 
for sample,data in D_sample_data.items(): 
    SR_row = pd.Series(data.D_key_value) 
    DF.append(SR_row) 
DF.head() 

TypeError: Can only append a Series if ignore_index=True or if the Series has a name 

Potem próbowałem

DF = DataFrame() 
for sample,data in D_sample_data.items(): 
    SR_row = pd.Series(data.D_key_value,name=sample) 
    DF.append(SR_row) 
DF.head() 

Empty DataFrame

Tried Insert a row to pandas dataframe wciąż otrzymuję pustą dataframe:/

Próbuję uzyskać Series być wiersze , gdzie indeks serii staje się etykietami kolumnowymi DataFrame

+0

Próbuję dodać wiersze. Indeks serii powinien być kolumnami DataFrame. Zatem wiersze będą próbkami, a kolumny będą funkcjami. –

+0

Czy próbowałeś dodać nazwę do serii, jak sugeruje komunikat o błędzie? – BrenBarn

+0

Musisz przeczytać komunikat o błędzie. Mówi, aby dodać nazwę do serii lub użyć 'ignore_index = True'. Jeśli to zrobisz, działa dobrze. – BrenBarn

Odpowiedz

19

Być może łatwiejszym sposobem byłoby dodanie pandas.Series do argumentu pandas.DataFrame z ignore_index=True do DataFrame.append(). Przykład -

DF = DataFrame() 
for sample,data in D_sample_data.items(): 
    SR_row = pd.Series(data.D_key_value) 
    DF = DF.append(SR_row,ignore_index=True) 

Demo -

In [1]: import pandas as pd 

In [2]: df = pd.DataFrame([[1,2],[3,4]],columns=['A','B']) 

In [3]: df 
Out[3]: 
    A B 
0 1 2 
1 3 4 

In [5]: s = pd.Series([5,6],index=['A','B']) 

In [6]: s 
Out[6]: 
A 5 
B 6 
dtype: int64 

In [36]: df.append(s,ignore_index=True) 
Out[36]: 
    A B 
0 1 2 
1 3 4 
2 5 6 

Kolejną kwestią w kodzie jest DataFrame.append() jest nie na miejscu, to zwraca załączonych dataframe, trzeba by przypisać go do listy oryginalna ramka danych do działania. Przykład -

DF = DF.append(SR_row,ignore_index=True) 

Aby zachować etykiety, można korzystać z rozwiązania obejmują nazwę dla serii wraz z przypisaniem dołączany DataFrame powrotem do DF. Przykład -

DF = DataFrame() 
for sample,data in D_sample_data.items(): 
    SR_row = pd.Series(data.D_key_value,name=sample) 
    DF = DF.append(SR_row) 
DF.head() 
+0

Widziałem to na powyższym łączu "Wstaw wiersz do pandasowej ramki danych". Próbuję to zepsuć. Może jest coś, czego nie robię poprawnie. –

+3

Ah man, dzięki! Nie złapałem DF = DF.append() Jest to sposób inny niż dołączanie listy. Przepraszam, że tęskniłem. –

+0

Zgubiłem etykiety indeksu. Czy istnieje sposób na zachowanie tego? –

7

DataFrame.append nie modyfikuje ramki DataFrame w miejscu. Musisz wykonać df = df.append(...), jeśli chcesz ponownie przypisać go do oryginalnej zmiennej.

1

Coś jak to może działać ...

mydf.loc['newindex'] = myseries 

Oto przykład, gdzie użyłem go ...

stats = df[['bp_prob', 'ICD9_prob', 'meds_prob', 'regex_prob']].describe() 

stats 
Out[32]: 
      bp_prob ICD9_prob meds_prob regex_prob 
count 171.000000 171.000000 171.000000 171.000000 
mean  0.179946 0.059071 0.067020 0.126812 
std  0.271546 0.142681 0.152560 0.207014 
min  0.000000 0.000000 0.000000 0.000000 
25%  0.000000 0.000000 0.000000 0.000000 
50%  0.000000 0.000000 0.000000 0.013116 
75%  0.309019 0.065248 0.066667 0.192954 
max  1.000000 1.000000 1.000000 1.000000 

medians = df[['bp_prob', 'ICD9_prob', 'meds_prob', 'regex_prob']].median() 

stats.loc['median'] = medians 

stats 
Out[36]: 
      bp_prob ICD9_prob meds_prob regex_prob 
count 171.000000 171.000000 171.000000 171.000000 
mean  0.179946 0.059071 0.067020 0.126812 
std  0.271546 0.142681 0.152560 0.207014 
min  0.000000 0.000000 0.000000 0.000000 
25%  0.000000 0.000000 0.000000 0.000000 
50%  0.000000 0.000000 0.000000 0.013116 
75%  0.309019 0.065248 0.066667 0.192954 
max  1.000000 1.000000 1.000000 1.000000 
median 0.000000 0.000000 0.000000 0.013116