2016-05-23 16 views
1

Ich habe ein paar CSV-Dateien, die ein Paar von Lagern für viele Standorte enthalten. Ich versuche, die Werte zu erweitern, um jede Zahl zwischen den Lagerpaaren für jede Position aufzunehmen, und die variablen Längen als CSV im selben Format zu exportieren.Anfügen von Spalten mit variabler Länge in Pandas Datenframe Python

Beispiel:

df = pd.read_csv('bearing.csv') 

Datenstruktur:

 A   B   C   D   E    
0 0   94   70  67   84  
1 120  132   109  152   150   

Ideal Ergebnis ist ein variabler Länge mehrdimensionales Array:

 A   B   C   D   E    
0 0   94   70  67   84  
1 1   95   71  68   85 
2 3   96   72  69   86 
... 
n 120  132   109  152   150 

ich durch jede Spalte am Looping und immer den Bereich der das Paar Werte, aber ich kämpfe, wenn ich versuche, die alte Spalte mit der ne zu überschreiben w Wertebereich.

for col in bear: 
    min_val = min(bear[col]) 
    max_val = max(bear[col]) 
    range_vals = range(min(bear[col]), max(bear[col])+1) 
    bear[col] = range_vals 

Ich erhalte die folgende Fehlermeldung:

ValueError: Length of values does not match length of index 
+0

'Pandas' Datenrahmen müssen jede Spalte die gleiche Länge haben, es gibt keinen wirklichen Weg darum herum. Sie können für jeden Bereich separate "Serien" erstellen, ansonsten bin ich mir nicht sicher, wie ich erreichen soll, was Sie tun möchten. Wenn Sie diese Spalten mit variabler Länge im selben Datenrahmen hätten, was würde es bedeuten, dass die Werte in den verschiedenen Spalten in derselben Zeile stehen? Bedeuten die Zeilen irgendeine Art von Beziehung? – Marius

Antwort

1

Sie dict Verständnis mit min und max in DataFrame contructor verwenden können, aber Sie bekommen eine Menge NaN am Ende der Spalten:

df = pd.DataFrame({col: pd.Series(range(df[col].min(), 
             df[col].max() + 1)) for col in df.columns }) 
print (df) 
print (df) 

     A  B  C  D  E 
0  0 94.0 70.0 67.0 84.0 
1  1 95.0 71.0 68.0 85.0 
2  2 96.0 72.0 69.0 86.0 
3  3 97.0 73.0 70.0 87.0 
4  4 98.0 74.0 71.0 88.0 
5  5 99.0 75.0 72.0 89.0 
6  6 100.0 76.0 73.0 90.0 
7  7 101.0 77.0 74.0 91.0 
8  8 102.0 78.0 75.0 92.0 
9  9 103.0 79.0 76.0 93.0 
10 10 104.0 80.0 77.0 94.0 
11 11 105.0 81.0 78.0 95.0 
12 12 106.0 82.0 79.0 96.0 
13 13 107.0 83.0 80.0 97.0 
14 14 108.0 84.0 81.0 98.0 
15 15 109.0 85.0 82.0 99.0 
16 16 110.0 86.0 83.0 100.0 
17 17 111.0 87.0 84.0 101.0 
18 18 112.0 88.0 85.0 102.0 
19 19 113.0 89.0 86.0 103.0 
20 20 114.0 90.0 87.0 104.0 
21 21 115.0 91.0 88.0 105.0 
22 22 116.0 92.0 89.0 106.0 
23 23 117.0 93.0 90.0 107.0 
24 24 118.0 94.0 91.0 108.0 
25 25 119.0 95.0 92.0 109.0 
26 26 120.0 96.0 93.0 110.0 
27 27 121.0 97.0 94.0 111.0 
28 28 122.0 98.0 95.0 112.0 
29 29 123.0 99.0 96.0 113.0 
.. ... ... ... ... ... 
91 91 NaN NaN NaN NaN 
92 92 NaN NaN NaN NaN 
93 93 NaN NaN NaN NaN 
94 94 NaN NaN NaN NaN 
95 95 NaN NaN NaN NaN 
96 96 NaN NaN NaN NaN 
97 97 NaN NaN NaN NaN 
98 98 NaN NaN NaN NaN 
99 99 NaN NaN NaN NaN 
100 100 NaN NaN NaN NaN 
101 101 NaN NaN NaN NaN 
102 102 NaN NaN NaN NaN 
103 103 NaN NaN NaN NaN 
104 104 NaN NaN NaN NaN 
105 105 NaN NaN NaN NaN 
106 106 NaN NaN NaN NaN 
107 107 NaN NaN NaN NaN 
108 108 NaN NaN NaN NaN 
109 109 NaN NaN NaN NaN 
110 110 NaN NaN NaN NaN 
111 111 NaN NaN NaN NaN 
112 112 NaN NaN NaN NaN 
113 113 NaN NaN NaN NaN 
114 114 NaN NaN NaN NaN 
115 115 NaN NaN NaN NaN 
116 116 NaN NaN NaN NaN 
117 117 NaN NaN NaN NaN 
118 118 NaN NaN NaN NaN 
119 119 NaN NaN NaN NaN 
120 120 NaN NaN NaN NaN 

Wenn Sie nur wenige Spalten haben, besteht die Möglichkeit:

df = pd.DataFrame({'A': pd.Series(range(df.A.min(), df.A.max() + 1)), 
        'B': pd.Series(range(df.B.min(), df.B.max() + 1))}) 

EDIT:

Wenn min Wert in der ersten Reihe und die max in letzter ist, können Sie iloc:

df = pd.DataFrame({col: pd.Series(range(df[col].iloc[0], 
             df[col].iloc[-1] + 1)) for col in df.columns }) 

Zeiten:

In [3]: %timeit (pd.DataFrame({col: pd.Series(range(df[col].iloc[0], df[col].iloc[-1] + 1)) for col in df.columns })) 
1000 loops, best of 3: 1.75 ms per loop 

In [4]: %timeit (pd.DataFrame({col: pd.Series(range(df[col].min(), df[col].max() + 1)) for col in df.columns }) ) 
The slowest run took 5.50 times longer than the fastest. This could mean that an intermediate result is being cached. 
100 loops, best of 3: 2.18 ms per loop 
+0

Vielen Dank! Funktioniert gut – emboylen

Verwandte Themen