2015-07-16 12 views
8

Ich versuche eine Loop-Funktion zu verwenden, um eine Matrix zu erstellen, ob ein Produkt in einer bestimmten Woche gesehen wurde.Python: Verwenden von .iterrows() zum Erstellen von Spalten

Jede Zeile in der df (die ein Produkt darstellt) hat ein close_date (das Datum, an dem das Produkt geschlossen wurde) und ein week_diff (die Anzahl der Wochen, in denen das Produkt aufgelistet wurde).

import pandas 
mydata = [{'subid' : 'A', 'Close_date_wk': 25, 'week_diff':3}, 
      {'subid' : 'B', 'Close_date_wk': 26, 'week_diff':2}, 
      {'subid' : 'C', 'Close_date_wk': 27, 'week_diff':2},] 
df = pandas.DataFrame(mydata) 

Mein Ziel ist es zu sehen, wie viele alternative Produkte für jedes Produkt in jedem date_range aufgeführt wurden

Ich habe die folgende Schleife einzurichten:

for index, row in df.iterrows(): 
    i = 0 
    max_range = row['Close_date_wk']  
    min_range = int(row['Close_date_wk'] - row['week_diff']) 
    for i in range(min_range,max_range): 
     col_head = 'job_week_' + str(i) 
     row[col_head] = 1 

Können Sie mir bitte erklären, warum die Die Zeile "row [col_head] = 1" fügt weder eine Spalte hinzu, noch fügt sie dieser Spalte für diese Zeile einen Wert hinzu.

Zum Beispiel, wenn:

row A has date range 1,2,3 
row B has date range 2,3 
row C has date range 3,4,5' 

dann im Idealfall würde Ich mag bis Ende mit

row A has 0 alternative products in week 1 
      1 alternative products in week 2 
      2 alternative products in week 3 
row B has 1 alternative products in week 2 
      2 alternative products in week 3 
&c.. 
+0

Ich glaube 'iterrows()' ist ein Python [Panda] (http: //pandas.pydata.org/) Methode auf einem Datenrahmen, der eine sehr spezifische Art von Datenstruktur ist. Es ist KEINE Kern-Python-Methode und kann nicht wie eine Standard-Python-Datenstruktur (wie eine Liste oder ein Wörterbuch) behandelt werden. Sie werden viel mehr Glück haben, wenn Sie bei dieser Frage Hilfe erhalten, wenn Sie angeben, dass es sich um eine ** Pandas ** -Frage und nicht nur um eine Python-Frage handelt. – tatlar

+1

Du kannst ein df nicht mit der 'row' von' iterrows' mutieren, du brauchst 'df.loc',' df.iloc', 'df.ix' – EdChum

+1

Also probiere' row [col_head] = 1' zu 'df.loc [row, col_head] = 1' – EdChum

Antwort

8

können Sie nicht die df mutieren row hier mit einer neuen Spalte hinzuzufügen, Sie‘ d entweder auf die ursprüngliche df beziehen oder verwenden .loc, .iloc oder .ix, Beispiel:

In [29]: 

df = pd.DataFrame(columns=list('abc'), data = np.random.randn(5,3)) 
df 
Out[29]: 
      a   b   c 
0 -1.525011 0.778190 -1.010391 
1 0.619824 0.790439 -0.692568 
2 1.272323 1.620728 0.192169 
3 0.193523 0.070921 1.067544 
4 0.057110 -1.007442 1.706704 
In [30]: 

for index,row in df.iterrows(): 
    df.loc[index,'d'] = np.random.randint(0, 10) 
df 
Out[30]: 
      a   b   c d 
0 -1.525011 0.778190 -1.010391 9 
1 0.619824 0.790439 -0.692568 9 
2 1.272323 1.620728 0.192169 1 
3 0.193523 0.070921 1.067544 0 
4 0.057110 -1.007442 1.706704 9 

können Sie ändern vorhandene Zeilen:

In [31]: 
# reset the df by slicing 
df = df[list('abc')] 
for index,row in df.iterrows(): 
    row['b'] = np.random.randint(0, 10) 
df 
Out[31]: 
      a b   c 
0 -1.525011 8 -1.010391 
1 0.619824 2 -0.692568 
2 1.272323 8 0.192169 
3 0.193523 2 1.067544 
4 0.057110 3 1.706704 

Aber das Hinzufügen einer neuen Spalte Zeile mit nicht funktionieren:

In [35]: 

df = df[list('abc')] 
for index,row in df.iterrows(): 
    row['d'] = np.random.randint(0,10) 
df 
Out[35]: 
      a b   c 
0 -1.525011 8 -1.010391 
1 0.619824 2 -0.692568 
2 1.272323 8 0.192169 
3 0.193523 2 1.067544 
4 0.057110 3 1.706704 
+0

Danke, hat einen Charme gearbeitet. Wird ab jetzt mehr Aufmerksamkeit auf Pandas gegenüber Core Python richten, :) Lösung hinzugefügt zu OP. – citydreams

+0

Verstanden. Danke noch einmal. * Doffs Neuling hat * – citydreams

Verwandte Themen