我正在嘗試根據 if 條件在 for 回圈中改變資料框。
import pandas as pd
#read the read.csv file
def write_csv(email, info):
df1 = pd.read_csv('/Users/thavas/Downloads/write.csv')
#iterate over df1 and look for email
for index, row in df1.iterrows():
print(index)
if row['Email 1'] == email:
#change the value of column 8 to "hello"
df1.loc[index,'Email 2'] = "hello"
df1.to_csv('/Users/thavas/Downloads/out.csv')
def read_csv():
#iterate over rows in dataframe
df = pd.read_csv('/Users/thavas/Downloads/read.csv')
for index,rows in df.iterrows():
email = rows['Email']
#if email available
if email != 'nan':
#get column 8,9,10,11 of rows
info = rows[8:17]
write_csv(email, info)
else:
print("Users", rows['Contact'], "has no email")
read_csv()
但是,我遇到了一個錯誤,其中使用 if 陳述句,沒有資料被添加到 csv 檔案中。
做了一些除錯,我意識到通過將列印陳述句放在 if 陳述句中,我得到了很多輸出。所以進入 if 陳述句不是問題。
此外,在取出所有 if 陳述句后,我看到輸出到我的 csv 檔案中。可能出了什么問題?
更新 我注意到只有最后一個資料回圈被讀取并更新到我的輸出檔案中。
這是什么意思?
uj5u.com熱心網友回復:
我已經簡化了問題以使我的解釋更容易。我在 ( , 和 ) 中只使用了三列read.csv
并且eid
有name
( email
,write.csv
和email1
) email2
。
目標是創建out.csv
一個副本,write.csv
其中填寫了 .email 中存在的所有電子郵件的 email2 欄位read.csv
。
以下代碼符合您的大部分邏輯,我將使用它來突出一些問題。
import pandas as pd
# printing just so you can see the structure explained above
rdf = pd.read_csv('./read.csv')
wdf = pd.read_csv('./write.csv')
print("read.csv")
print(rdf)
print("write.csv")
print(wdf)
def write_csv(email):
df1 = pd.read_csv('./write.csv')
#iterate over df1 and look for email
for index, row in df1.iterrows():
if row['email1'] == email:
#change the value of column 8 to "hello"
df1.loc[index,'email2'] = "hello"
df1.to_csv('./out.csv') # <---- Reference 2
# ^ Reference 3
def read_csv():
#iterate over rows in dataframe
df = pd.read_csv('./read.csv')
for index,rows in df.iterrows():
email = rows['email']
#if email available
if email != 'nan': # <-- Reference 1
write_csv(email) # <-- Reference 4
read_csv()
和輸出
(stackoverflow) /tmp $ python test.py
read.csv
eid name email
0 1 Tom [email protected]
1 2 Alice
2 3 Bob [email protected]
3 4 Tim
write.csv
email1 email2
0 [email protected] email2-unknown
1 [email protected] email2-unknown
(stackoverflow) /tmp $ cat out.csv
,email1,email2
0,[email protected], email2-unknown
1,[email protected], email2-unknown
參考1:
這實際上取決于您的 csv 檔案以及您希望在那里找到的內容。如果空電子郵件實際上在您的檔案中表示為“nan”,那么這似乎很好。但是,在我的情況下,該檔案實際上沒有 ( ''
) 用于丟失電子郵件。所以 pandas 制作了它們NaN
。但是,您不能直接將其與'nan'
.
可能的解決方案
if str(email) == 'nan'
因為 str(nan) 是'nan'
if isinstance(email, float) and np.isnan(email)
wherenp.isnan
是 numpy 的一個函式,但僅適用于浮點數。給它一個字串會導致錯誤。- 在開始時將整個列轉換為字串,然后遍歷行。
pd.read_csv('./read.csv').astype({'email':'str'})
. 然后,您可以email == 'nan'
像以前一樣進行比較。 - 僅迭代非 nan 值。即
for index, rows in df[~df.email.isna()].iterrows()
wheredf.email.isna()
檢查某物是否為 NaN 并~
否定它。因此,您將獲得電子郵件不是 NaN 的所有行。
這樣,您就可以保證write_csv
正確呼叫它。
參考2:
每次迭代都撰寫out.csv
成本很高。如果write.csv
有 1000 行,您將寫out.csv
1000 次。相反,您只想out.csv
在 for 回圈之外撰寫一次。
參考文獻 3 和 4:
當您找到來自 的非空電子郵件時read.csv
,write_csv
將呼叫特定電子郵件。例如,讓我們取第一行,[email protected]
。所以現在write_csv
讀取write.csv
、修改電子郵件所在的所有實體,tom...
然后將其寫入out.csv
。
除了當它移動到下一封非空電子郵件時bob...
,您再次閱讀write.csv
其中覆寫的內容out.csv
。write.csv
沒有您所做的更改tom
。這解釋了為什么您只會看到最后一封電子郵件。
可能的解決方案:
- 一個快速的解決方法是首先復制
write.csv
到out.csv
(在read_csv
呼叫之前)并將其修改write_csv
為始終讀取out.csv
和寫入out.csv
。
把它們放在一起:
import pandas as pd
import numpy as np
rdf = pd.read_csv('./read.csv')
wdf = pd.read_csv('./write.csv')
print("read.csv")
print(rdf)
print("write.csv")
print(wdf)
def write_csv(email):
df1 = pd.read_csv('./out.csv') # read from out
#iterate over df1 and look for email
for index, row in df1.iterrows():
if row['email1'] == email:
#change the value of column 8 to "hello"
df1.loc[index,'email2'] = "hello"
# outside for loop
# write to out, so next call with different email also persists
df1.to_csv('./out.csv')
def read_csv():
#iterate over rows in dataframe
df = pd.read_csv('./read.csv')
# iterate over rows with non-nan emails
for index,rows in df[~df.email.isna()].iterrows():
# I've removed the info part with other columns but you get the idea...
email = rows['email']
write_csv(email)
import shutil
shutil.copyfile('./write.csv', './out.csv') # first copy to out
read_csv()
以上將為您提供一個可行的解決方案,但仍然非常低效,因為您正在out.csv
為每封存在的電子郵件寫作。
相反,考慮out.csv
通過合并/連接來自read.csv
和的資料框來創建write.csv
。以下是檔案
合并和
加入的一些鏈接。也許還可以查看有關 pandas 連接和合并的 stackoverflow 問題中的一些示例。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/529477.html
標籤:Python熊猫CSVif 语句
上一篇:嵌套回圈和if陳述句的R代碼錯誤
下一篇:模板中的部分屬性