我从本地保存的CSV文件中读取了一个数据帧。然后我想循环遍历所述文件,并基于一列中的字符串创建几个CSV文件。
最后,我想将所有这些文件添加到一个zip文件中,但不将它们保存在本地。我只想要一个zip档案,包括所有不同的CSV文件。
我使用io或zipfile模块的所有尝试都只产生了一个zip文件,其中有一个CSV文件(与我开始使用的文件非常相似(
任何帮助都将不胜感激!这是我到目前为止的代码,它可以工作,但只将所有CSV文件保存到我的硬盘上。
import pandas as pd
from zipfile import ZipFile
df = pd.read_csv("myCSV.csv")
channelsList = df["Turn one column to list"].values.tolist()
channelsList = list(set(channelsList)) #delete duplicates from list
for channel in channelsList:
newDf = df.loc[df['Something to match'] == channel]
newDf.to_csv(f"{channel}.csv") # saves csv files to disk
DataFrame.to_csv()
可以写入任何类似对象的文件,而ZipFile.writestr()
可以接受字符串(或字节(,因此可以避免使用io.StringIO
将CSV文件写入磁盘。请参阅下面的示例代码。
注意:如果channel
只是存储在输入数据的一列中,那么迭代数据分区的更惯用(更高效(的方法是使用groupby()
。
from io import StringIO
from zipfile import ZipFile
import numpy as np
import pandas as pd
# Example data
df = pd.DataFrame(np.random.random((100,3)), columns=[*'xyz'])
df['channel'] = np.random.randint(5, size=len(df))
with ZipFile('/tmp/output.zip', 'w') as zf:
for channel, channel_df in df.groupby('channel'):
s = StringIO()
channel_df.to_csv(s, index=False, header=True)
zf.writestr(f"{channel}.csv", s.getvalue())