2017-05-07 2 views
2

Ich habe eine pandas.DataFrame wie folgt:Wie du Python-Dataframe eins nach dem anderen duplizierst?

df1 = 
    a b 
0 1 2 
1 3 4 

Ich möchte diese dreimal machen werden:

df2 = 
    a b 
0 1 2 
0 1 2 
0 1 2 
1 3 4 
1 3 4 
1 3 4 

df2 aus einer Schleife hergestellt, aber es ist nicht effizient.

Wie kann ich df2 von df1 mit einem Matrix-Weg, der schneller ist?

Antwort

2

Ich weiß nicht, ob es effizienter ist als die Schleife, aber es einfach genug zu konstruieren, wie:

Code:

pd.concat([df] * 3).sort_index() 

Testcode:

df = pd.DataFrame([[1, 2], [3, 4]], columns=list('ab')) 
print(pd.concat([df] * 3).sort_index()) 

Ergebnisse:

a b 
0 1 2 
0 1 2 
0 1 2 
1 3 4 
1 3 4 
1 3 4 
+1

Sie haben auch den Index genagelt ... auch wenn es langsamer ist. – piRSquared

2

können Sie verwenden np.repeat

df = pd.DataFrame(np.repeat(df.values,[3,3], axis = 0), columns = df.columns) 

Sie erhalten

a b 
0 1 2 
1 1 2 
2 1 2 
3 3 4 
4 3 4 
5 3 4 

Zeitprüfung:

%timeit pd.DataFrame(np.repeat(df.values,[3,3], axis = 0)) 
1000 loops, best of 3: 235 µs per loop 

%timeit pd.concat([df] * 3).sort_index() 
best of 3: 1.26 ms per loop 

Numpy ist auf jeden Fall schneller in den meisten Fällen, so gibt es keine Überraschungen

EDIT: Ich bin nicht sicher, ob Sie Sie Indizes für die Wiederholung aber einhüllen tun würde suchen,

pd.DataFrame(np.repeat(df.values,3, axis = 0), index = np.repeat(df.index, 3), columns = df.columns) 
+0

Sie vermissen den Index wird auch wiederholt – piRSquared

+0

@piRSquared, danke! Ich habe das jetzt aufgenommen :) – Vaishali

1

Sie numpy.repeat mit Parameter Skalar 3 und dann columns Parameter DataFrame Konstruktor hinzufügen können:

df = pd.DataFrame(np.repeat(df.values, 3, axis=0), columns=df.columns) 
print (df) 
    a b 
0 1 2 
1 1 2 
2 1 2 
3 3 4 
4 3 4 
5 3 4 

Wenn wirklich Index dupliziert werden soll, was einige Pandabärenfunktionen wie reindex, die durchgefallen sind, schwierig sein kann:

r = np.repeat(np.arange(len(df.index)), 3) 
df = pd.DataFrame(df.values[r], df.index[r], df.columns) 
print (df) 
    a b 
0 1 2 
0 1 2 
0 1 2 
1 3 4 
1 3 4 
1 3 4 
+0

Plust eins von mir! – piRSquared

3

Erstellen Sie einen eindimensionalen Indexer, um sowohl das Array values als auch index zu schneiden. Sie müssen sich auch um den Index kümmern, um Ihre gewünschten Ergebnisse zu erhalten.

  • Verwendung np.repeat auf einem np.arange zu bekommen den Indexer
  • auf beiden Werten und den Index

r = np.arange(len(df)).repeat(3) 
pd.DataFrame(df.values[r], df.index[r], df.columns) 

    a b 
0 1 2 
0 1 2 
0 1 2 
1 3 4 
1 3 4 
1 3 4 
+1

Sie meinen, wenn die Frauen der großen Gewehre darauf bestehen, dass sie etwas anderes tun, als Fragen zu SO zu beantworten :-) – piRSquared

+0

Ja genau. Meiner musste unsere Tochter über eine Stunde zu ihrem Abschlussball fahren, also war ich frei ... –

0

Nicht der schnellste (nicht der langsamste einen neuen Datenrahmen mit diesen Indexer konstruieren entweder) aber bisher die kürzeste Lösung.

#Build a index array and extract the rows to build the desired new df. This handles index and data all at once.  
df.iloc[np.repeat(df.index,3)] 

Out[270]: In [271]: 
    a b 
0 1 2 
0 1 2 
0 1 2 
1 3 4 
1 3 4 
1 3 4 
Verwandte Themen