In Ihrem Code durchlaufen Sie die Elemente in Spalte B des Datenrahmens, aber Sie haben keine Möglichkeit, in Ihren ursprünglichen Datenrahmen zu indizieren. Insbesondere die Zeile:
df['B'][item] = item_v
,
nicht tun, was Sie wollen. Es platziert einen neuen Artikel in Spalte B mit einem Index von item
. Wenn Sie es mit einem kleinen Datenrahmen versuchen, werden Sie wahrscheinlich einige ungerade Werte am Ende des Rahmens sehen. Als ich dies versuchen, erhalte ich:
In[36]: df
Out[36]:
A B
0 aa 1234
1 ab 3456
2 bc 1357
3 cc 8901
In[37]: df['B'][item] = item_v
In[38]: df['B']
Out[38]:
0 1234
1 3456
2 1357
3 8901
8901 8901 <-- ???
Name: B, dtype: object
Erschwerend kommt hinzu, wird diese Zeile nicht den Wert in den Datenrahmen einfügen, wo man erwarten würde. Das neue Element wird nur angezeigt, wenn Sie df['B']
betrachten. Wenn Sie nur df
betrachten, sehen Sie den ursprünglichen Datenrahmen ohne den zusätzlichen Gegenstand.
Der richtige Weg ist es, Elemente zu setzen in einem Datenrahmen .loc[]
dergleichen zu verwenden ist:
df.loc[item,'B'] = item_v
tut dies noch nicht das ursprüngliche Problem lösen, das ist, wie den korrekten Index zu erhalten. Ein Update für Ihren ursprünglichen Code ist Wert zu akkumulieren für jedes Element in der Spalte B in einer Liste und dann auf der Spalte B wie folgt vergeben zurück:
newB = []
for item in df['B']:
if len(item) > 4:
item_v = str(item[1:5])
else:
item_v = item
newB.append(item_v)
print(newB)
df.loc[:, 'B'] = newB
jedoch mit pandas
gibt es auch Lösungen, die nicht erfordern direkt über die Elemente in Spalte B.
Zum Beispiel können Sie verwenden, um nur die Zeichenfolgen länger als 4 Zeichen zusammen mit den .str
Funktionen zu ändern, um die Textelemente zu ändern. Dieses Motto wird die Arbeit machen:
df.loc[:,'B'] = df['B'].where((df['B'].str.len() <= 4), df['B'].str[1:5])
Diese Anweisung erstellt eine Serie, die das Element aus der Spalte B enthält, wenn es 4 oder weniger Zeichen, oder die Scheibe [1: 5] des Elements in Spalte B, wenn es ist länger als 4 Zeichen. Diese Reihe wird dann zugewiesen, um die Spalte B in df
zu ersetzen.
Sind die Daten in Spalte B tatsächlich Text? Oder ist es eine Mischung aus ganzen Zahlen und Listen? Wenn Pandas die Daten als Listen speichert, haben Sie keine Länge> 4. Versuchen Sie, 'type (df.loc [3, 'B'])' 'auszuführen, um zu sehen, um welchen Typ es sich handelt, es kann eine Liste sein. – James
Es ist eine Zeichenfolge. –