2016-10-13 6 views
2

Ich habe eine Tabelle mit 14 Spalten und ich möchte ausgewählte in einen neuen Datenrahmen ziehen. Sagen wir, ich Spalte wollen 0 dann Spalte 8-14Einen Bereich in eine Pandas-Serie einbetten

dfnow = pd.Series([df.iloc[row_count,0], \ 
        df.iloc[row_count,8], \ 
        df.iloc[row_count,9], \ 
        .... 

Werke scheint aber ungeschickt

I

dfnow = pd.Series([df.iloc[row_count,0], \ 
      df.iloc[row_count, range (8, 14)]]) 

schreiben möchte Aber das wirft ein Valueerror: Falsche Anzahl der Elemente bestanden

Nun, von der Antwort unten, weiß ich, dass ich zwei separate Sereis erstellen und verketten kann, aber das scheint auch ein wenig suboptimal.

Adding pandas Series with different indices without getting NaNs

Antwort

0

ich glaube, Sie alle Werte auf lists konvertieren und dann erstellen Series, aber dann verloren Indizes:

df = pd.DataFrame({'A':[1,2,3], 
        'B':[4,5,6], 
        'C':[7,8,9], 
        'D':[1,3,5], 
        'E':[5,3,6], 
        'F':[7,4,3]}) 

print (df) 
    A B C D E F 
0 1 4 7 1 5 7 
1 2 5 8 3 3 4 
2 3 6 9 5 6 3 

row_count = 1 

print (df.iloc[row_count, range (2, 4)]) 
C 8 
D 3 
Name: 1, dtype: int64 

dfnow = pd.Series([df.iloc[row_count,0]] + df.iloc[row_count, range (2, 4)].tolist()) 
print (dfnow) 
0 2 
1 8 
2 3 
dtype: int64 

Oder Sie können concat verwenden, dann sind Indizes Spaltennamen:

row_count = 1 

a = df.iloc[row_count, range (2, 4)] 
b = df.iloc[row_count, range (4, 6)] 

print (a) 
C 8 
D 3 
Name: 1, dtype: int64 

print (b) 
E 3 
F 4 
Name: 1, dtype: int64 

print (pd.concat([a,b])) 
C 8 
D 3 
E 3 
F 4 
Name: 1, dtype: int64 

Aber wenn Skalar müssen hinzufügen (a), ist es ein wenig kompliziert - Notwendigkeit Series:

row_count = 1 

a = pd.Series(df.iloc[row_count, 0], index=[df.columns[0]]) 
b = df.iloc[row_count, range (2, 4)] 
c = df.iloc[row_count, range (4, 6)] 

print (a) 
A 2 
dtype: int64 

print (b) 
C 8 
D 3 
Name: 1, dtype: int64 

print (c) 
E 3 
F 4 
Name: 1, dtype: int64 

print (pd.concat([a,b,c])) 
A 2 
C 8 
D 3 
E 3 
F 4 
dtype: int64 
+0

Dies funktionierte, und ich behielt die Indizes über: .... df.iloc [row_count, Bereich (9,14) ] .tolist(), index = Spalten). Vielen Dank – user2723494

1

Ist das, was Sie wollen?

In [52]: df = pd.DataFrame(np.arange(30).reshape(5,6), columns=list('abcdef')) 

In [53]: df 
Out[53]: 
    a b c d e f 
0 0 1 2 3 4 5 
1 6 7 8 9 10 11 
2 12 13 14 15 16 17 
3 18 19 20 21 22 23 
4 24 25 26 27 28 29 

In [54]: df[[0,2,4]] 
Out[54]: 
    a c e 
0 0 2 4 
1 6 8 10 
2 12 14 16 
3 18 20 22 
4 24 26 28 

verketten (Umgestaltung) Spalten 0, 2, 4 in einzelne Serie:

In [68]: df[[0,2,4]].values.T.reshape(-1,) 
Out[68]: array([ 0, 6, 12, 18, 24, 2, 8, 14, 20, 26, 4, 10, 16, 22, 28]) 

In [69]: pd.Series(df[[0,2,4]].values.T.reshape(-1,)) 
Out[69]: 
0  0 
1  6 
2  12 
3  18 
4  24 
5  2 
6  8 
7  14 
8  20 
9  26 
10  4 
11 10 
12 16 
13 22 
14 28 
dtype: int32 
+0

für Ihre Antwort Danke schneiden zu konstruieren. Ich denke, die Umformung würde funktionieren, und ist wahrscheinlich das akzeptierte Verfahren für das, was ich erreichen wollte. +1 – user2723494

1

betrachten die df

from string import ascii_uppercase 
import pandas as pd 
import numpy as np 

df = pd.DataFrame(np.arange(150).reshape(-1, 15), 
        columns=list(ascii_uppercase[:15])) 
df 

enter image description here

Verwendung np.r_ das Array neccesary für die Scheibe Sie

wollen
np.r_[0, 8:14] 

array([ 0, 8, 9, 10, 11, 12, 13]) 

dann

df.iloc[:, np.r_[0, 8:14]] 

enter image description here

Verwandte Themen