使用 pandas 数据帧值进行迭代
Iteration using pandas dataframe values
在循环迭代时,如果满足条件则更改值。
但是,原始数据框保持不变。
有办法解决吗?
(我知道itertuples,iterrows loc可以用。但是我想用values。(更快))
import panda as pd
df = pd.read_csv(filename)
for value in df.values:
if A:
value[2] = 3
print(value) # changed
df.to_csv(newfilename) # unchanged
CSV 也应该更改。我刚刚对此进行了测试,它发生了变化:
import pandas as pd
df = pd.DataFrame({
'A': [0,1,0,0,1,1,0,1,0],
'B': [1,0,1,1,0,0,1,0,1],
})
for value in df.values:
if value[0]==0:
value[1]=5
print(value) # changed
df #also changed
df.to_excel("output.xlsx") #also changed
按照 mozway 的建议,尝试矢量化代码。当您使用 pandas.
时,这通常是一件好事
df.loc[CONDITION, COLUMN_NAME_TO_WRITE_TO] = NEW_VALUE
对于您的示例,可能类似于
import panda as pd
df = pd.read_csv(filename)
df.loc[A, df.columns[2]] = 3 # instead of df.columns[INDEX] you could directly use the column name
df.to_csv(newfilename)
我使用 iat 进行了鞋底处理。
import panda as pd
df = pd.read_csv(filename)
cnt = 0
for value in df.values:
if A:
#value[2] = 3
df[cnt, 2] = 3
print(value) # changed
cnt += 1
df.to_csv(newfilename) # changed
此外,迭代(秒):df.values < itertuples < iterrows
在循环迭代时,如果满足条件则更改值。 但是,原始数据框保持不变。 有办法解决吗?
(我知道itertuples,iterrows loc可以用。但是我想用values。(更快))
import panda as pd
df = pd.read_csv(filename)
for value in df.values:
if A:
value[2] = 3
print(value) # changed
df.to_csv(newfilename) # unchanged
CSV 也应该更改。我刚刚对此进行了测试,它发生了变化:
import pandas as pd
df = pd.DataFrame({
'A': [0,1,0,0,1,1,0,1,0],
'B': [1,0,1,1,0,0,1,0,1],
})
for value in df.values:
if value[0]==0:
value[1]=5
print(value) # changed
df #also changed
df.to_excel("output.xlsx") #also changed
按照 mozway 的建议,尝试矢量化代码。当您使用 pandas.
时,这通常是一件好事df.loc[CONDITION, COLUMN_NAME_TO_WRITE_TO] = NEW_VALUE
对于您的示例,可能类似于
import panda as pd
df = pd.read_csv(filename)
df.loc[A, df.columns[2]] = 3 # instead of df.columns[INDEX] you could directly use the column name
df.to_csv(newfilename)
我使用 iat 进行了鞋底处理。
import panda as pd
df = pd.read_csv(filename)
cnt = 0
for value in df.values:
if A:
#value[2] = 3
df[cnt, 2] = 3
print(value) # changed
cnt += 1
df.to_csv(newfilename) # changed
此外,迭代(秒):df.values < itertuples < iterrows