2016-11-30 8 views
1

Ich habe einen Datenrahmen, die wie folgt aussieht:fill Datenrahmen Spalt gleich

ID Name 
1  Missing 
2  Missing 
3  Missing 
....... 

Gibt es eine Möglichkeit, in der ich gleich in dem Spaltennamen füllen könnte (+1), wenn len (df) uneben ist mit einem Anzahl der Namen, die ich gespeichert habe (eine Liste oder ein Wörterbuch). Für Ex wenn ich 2 Namen habe. Die Hälfte der Spalte wäre Name1, während die andere Hälfte Name2 wäre. Ich habe versucht:

for i in (range(len(df)/no_names)): 
    counter=0 
    df.ix[i]['Name'] = dictionary.values()[0] 

aber dies würde nur ausfüllen Reihen meine erste N auf, wie viele Namen, die ich habe.

Antwort

1

mein erster Versuch bei Python-Fragen, Dies ist definitiv nicht die effizienteste Lösung.

import pandas as pd 
df = pd.DataFrame({'a':[1,4,4,0,4,0,4,0],'b':[2,1,4,0,4,0,4,0]}) 
#df 
#Out[76]: 
# a b 
#0 1 2 
#1 4 1 
#2 3 3 
#3 4 4 
#4 0 0 
#5 4 4 
#6 0 0 
#7 4 4 
#8 0 0 

basierend auf der Länge jeder Spalte, wiederholen Name1 und Name2 entsprechend

df['new'] = np.repeat(np.array(["A", "B"]), repeats=[round(df.shape[0]/2), df.shape[0]-round(df.shape[0]/2)]) 

#Out[81]: 
# a b new 
#0 1 2 A 
#1 4 1 A 
#2 3 3 A 
#3 4 4 A 
#4 0 0 B 
#5 4 4 B 
#6 0 0 B 
#7 4 4 B 
#8 0 0 B 
2

Sie

import numpy as np 
N = len(df) 
df['Name'] = np.array(['Name1', 'Name2'])[np.linspace(0,2,N,endpoint=False).astype(int)] 

Die Idee dabei ist, verwenden könnte eine Reihe von 0en zu erstellen und 1, wie

In [34]: np.linspace(0,2,11,endpoint=False).astype(int) 
Out[34]: array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]) 

Jetzt können wir NumPy Indizierung verwenden, um eine Reihe von ‚Name1‘ und Werten ‚Name2‘ zu schaffen:

In [8]: np.array(['Name1', 'Name2'])[np.linspace(0,2,11,endpoint=False).astype(int)] 
Out[8]: 
array(['Name1', 'Name1', 'Name1', 'Name1', 'Name1', 'Name1', 'Name2', 
     'Name2', 'Name2', 'Name2', 'Name2'], 
     dtype='<U5') 
+0

Die sehr geehrter Herr ist phänomenal. –

+0

Mit Ihrer Methode unutbu ich habe ein Ergebnis, aber beim Drucken des Datenrahmens bekomme ich einen Fehler: Ein Wert versucht, auf eine Kopie eines Segments von einem DataFrame gesetzt werden. Versuchen Sie mit .loc [row_indexer, col_indexer] = Wert stattdessen Hinzufügen von Iloc nicht lösen, im Gegenteil gibt es kein Ergebnis zu meinem Druck –

+0

Diese Warnung - ich glaube, es ist ein UserWarning, keine Ausnahme - ist dass "df" eine * Kopie * eines Slices eines anderen DataFrames ist. Die Warnung ist da, aus großer Vorsicht, um Sie darauf aufmerksam zu machen, dass die Änderung von 'df' den ursprünglichen DataFrame nicht beeinflusst. Wenn dies nicht Ihre Absicht ist, können Sie das UserWarning ignorieren. Weitere Informationen und Möglichkeiten zum Stummschalten von UserWarning finden Sie unter http://stackoverflow.com/q/40033471/190597. – unutbu

Verwandte Themen