我是python的新手,并试图获得一个循环工作。我试图通过一个数据框架进行迭代-对于"帐户"列中的每个唯一值,我想创建一个具有帐户名称的csv文件。因此,应该创建一个Account1.csv, Account2.csv和Account3.csv。
当我运行这段代码,只有Account3.csv正在创建(我猜其他正在创建,但以某种方式覆盖?)
data = [('Account1', 'ibm', 20),
('Account1', 'aapl', 30),
('Account1', 'googl', 15),
('Account1', 'cvs', 18),
('Account2', 'wal', 24),
('Account2', 'abc', 65),
('Account2', 'bmw', 98),
('Account2', 'deo', 70),
('Account2', 'glen', 40),
('Account3', 'aapl', 50),
('Account3', 'googl', 68),
('Account3', 'orcl', 95)]
data_df = pd.DataFrame(data, columns = ['Acct', 'ticker', 'qty'])
acctlist = data_df["Acct"].drop_duplicates()
save_to = "c:/temp/csv/"
save_as = Acct + ".csv"
for Acct in acctlist:
#print(data_df[data_df["Acct"] == Acct])
Acct_df = (data_df[data_df["Acct"] == Acct])
Acct_df.to_csv(save_to + save_as)
永远不要在循环中重命名save_as
。试试这个:
for Acct in acctlist:
save_as = Acct + ".csv"
Acct_df = (data_df[data_df["Acct"] == Acct])
Acct_df.to_csv(save_to + save_as)
注意,在pandas数据框上循环通常不是一个好主意,因为它效率很低。在这种情况下,它可能工作得很好,特别是对于小数据帧,但通常你应该尽量避免它。
您可以使用apply
完成相同的任务:
import os
data_df.groupby('Acct').apply(
lambda group: pd.DataFrame.to_csv(group, os.path.join(save_to, f'{group.name}.csv'))
)
另一种拆分和写出csv的方法:
for acct, frame in df_out.groupby('Acct'):
frame.to_csv(os.path.join(save_to, f'{acct}.csv'))