我有一個從檔案中讀取的熊貓資料框,其中一些列包含字串,其中一些又包含用分號分隔的子字串。我的目標是將分號分隔的子字串轉換為字串串列并將它們放回資料框中。
當我df.iloc[-1][-1] = df.iloc[-1][-1].split(';');在包含帶分號的字串的單元格上使用時,沒有錯誤,但值df.iloc[-1][-1]沒有改變。
當我使用
newval = df.iloc[-1,-1]; newval
newval = df.iloc[-1,-1].split( ';' ); newval
df.iloc[-1][-1] = newval; df.iloc[-1][-1]
它顯示第一行的原始字串和第二行的子字串串列,但第三行再次顯示原始字串。看起來好像沒有分配任何內容——但也沒有錯誤訊息。
我的第一個猜測是不允許將字串串列放入包含字串的單元格中,但快速測驗表明這是可以的:
>>> df = pd.DataFrame([["a", "a;b"], ["a;A", "a;b;A;B"]], index=[1, 2], columns=['A', 'B']);
>>> df
A B
1 a a;b
2 a;A a;b;A;B
>>> for row in range ( df.shape [ 0 ] ):
... for col in range ( df.shape [ 1 ] ):
... value = df.iloc[row][col];
... if ( type ( value ) == str ):
... value = value.split( ';' );
... df.iloc[row][col] = value;
>>> df
A B
1 [a] [a, b]
2 [a, A] [a, b, A, B]
所以我很困惑為什么(i)分配在示例中有效,但不適用于我的 CSV 匯入的資料框,以及(ii)為什么 python 沒有給出錯誤訊息?
uj5u.com熱心網友回復:
老實說,您可以使用簡單的applymap. pandas 應該避免回圈。這里的 applymap 不一定會更快,但它肯定更容易使用和理解。
out = df.applymap(lambda x: x.split(';'))
輸出:
A B
1 [a] [a, b]
2 [a, A] [a, b, A, B]
為什么你的方法失敗了
您使用df.iloc[row][col] = value的可能會導致在副本上設定值,您應該df.iloc[row, col] = value改用它。你得到了SettingWithCopyWarning嗎?
并非所有值都是字串:
df.applymap(lambda x: x.split(';') if isinstance(x, str) else x)
例子:
df = pd.DataFrame([["a", 2], ["a;A", "a;b;A;B"]], index=[1, 2], columns=['A', 'B'])
df.applymap(lambda x: x.split(';') if isinstance(x, str) else x)
A B
1 [a] 2
2 [a, A] [a, b, A, B]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/516525.html
上一篇:在幾行中洗掉部分字串r
