2017-12-17 8 views
1

Ich habe einen Datenrahmen wieerweitern Datenrahmen in Pandas

import pandas as pd 

current = pd.DataFrame([{ 
    'a1': 'ab', 
    'a2': 'value' 
}, { 
    'a1': 'ef', 
    'a2': 'value' 
}]) 

I wie unten einen neuen Datenrahmen erstellen müssen.

new = pd.DataFrame([{ 
    'a1': 'ab', 
    'a2': 'value', 
    'a1Val': 'a' 
}, { 
    'a1': 'ab', 
    'a2': 'value', 
    'a1Val': 'b' 
}, { 
    'a1': 'ef', 
    'a2': 'value', 
    'a1Val': 'e' 
}, { 
    'a1': 'ef', 
    'a2': 'value', 
    'a1Val': 'f' 
}]) 

Iterieren durch einen Datenrahmen mit iterrows() oder itertuples() und Modifizieren oder Hinzufügen von Zeilen zu einem newDatafromve mit df.loc() scheint extrem langsam. Wie kann ich einen Datenrahmen erstellen oder die current wie new schneller ändern?

+0

Können Sie bitte erklären, was Sie versuchen zu tun? Ohne ein gut formuliertes Problem erhalten diese Art von Fragen (bei denen Sie nur Eingabe-Ausgabe-Paare haben) im Allgemeinen Lösungen, die für das Beispiel funktionieren, aber nicht verallgemeinern. – ayhan

+0

Ich mache gerade eine Datenmanipulation, grundsätzlich auf der Suche nach Ideen, um df ohne for-Schleife zu erstellen – Sarath

Antwort

2

Ich glaube, Sie Series mit string s erstellen müssen, neu zu gestalten, indem stack und join original DataFrame:

s = (current['a1'].apply(lambda x: pd.Series(list(x))) 
        .stack() 
        .rename('a1val') 
        .reset_index(level=1, drop=True)) 
print (s) 
0 a 
0 b 
1 e 
1 f 
Name: a1val, dtype: object 

df = current.join(s).reset_index(drop=True) 
print (df) 
    a1  a2 a1val 
0 ab value  a 
1 ab value  b 
2 ef value  e 
3 ef value  f 

Eine andere Lösung mit numpy, ersten a1 zu list s konvertieren und wiederholen index von length s für neue DataFrame erstellt von loc. Letzte neue Spalte mit hinzufügen:

s = current['a1'].apply(list) 
l = s.str.len() 
df = (current.loc[current.index.repeat(l)] 
      .assign(a1val=np.concatenate(s.values)) 
      .reset_index(drop=True)) 
print (df) 
    a1  a2 a1val 
0 ab value  a 
1 ab value  b 
2 ef value  e 
3 ef value  f