2 回答
TA贡献1719条经验 获得超6个赞
我会加载数据
pandas.read_csv
.rename
一些专栏创建数据帧后
working
,查看数据帧以验证已加载正确的列,并且使用正确的列索引进行重命名。重命名 , 中的列
working
取决于列索引,因为working.csv
没有列标题。的
date
列arch
实际上应该是email
,因为标题标识其下方的内容,而不是其他列标题。一旦在 中更改了列名称
archive.csv
,则不再需要重命名。
pandas.merge
在柱子上email
。由于两个数据框都有一列重命名为
email
,因此合并结果将只有一email
列。如果合并发生在两个不同的列名称上,则结果将有两列包含电子邮件地址。
pandas:合并、连接、连接和比较
只要文件中的列一致,就应该无需修改即可工作
import pandas as pd
from datetime import datetime
# get the date string
datestring = datetime.strftime(datetime.now(), '%d-%b')
# read archive
arch = pd.read_csv('archive.csv')
# rename columns
arch.rename(columns={'date': 'email'}, inplace=True)
# read working, but only the two columns that are needed
working = pd.read_csv('working.csv', header=None, usecols=[1, 3])
# rename columns
working.rename(columns={1: 'email', 3: datestring}, inplace=True)
# only emails greater than 30 or already in arch
working = working[(working[datestring] > 30) | (working.email.isin(arch.email))]
# merge
arch_updated = pd.merge(arch, working, on='email', how='outer').fillna(0)
# save to csv
arch_updated.to_csv('archive.csv', index=False)
# display(arch_updated)
email 01-sep 27-Aug
asdf@email.com 154.0 31.0
fsda@email.com 128.0 19.0
qwer@gmail.com 77.0 92.0
ffff@xmail.com 63.0 0.0
zxcv@email.com 0.0 117.0
TA贡献2016条经验 获得超9个赞
所以,问题是你有两组数据。两者都通过“关键”条目(电子邮件)存储数据以及您想要压缩到一个存储中的其他数据。确定这两组数据都存在相似的“密钥”可以大大简化这一过程。
将每个键想象为一个存储桶的名称。每个存储桶需要两条信息,一条来自一个 csv,另一条来自另一个 csv。
现在,我必须绕点小弯路来解释一下Python中的字典。这是从这里窃取的定义
字典是一个无序、可更改且有索引的集合。
集合是一个类似于保存数据的列表的容器。无序和索引意味着字典不能像列表一样访问,其中数据可以通过索引访问。在这种情况下,字典是使用键访问的,键可以是字符串或数字之类的任何东西(从技术上讲,键必须是可散列的,但这太深入了)。最后,可更改意味着字典实际上可以更改其存储的数据(再次过于简单化)。
例子:
dictionary = dict()
key = "Something like a string or a number!"
dictionary[key] = "any kind of value can be stored here! Even lists and other dictionaries!"
print(dictionary[key]) # Would print the above string
我建议您使用以下结构来代替大多数列表:
dictionary[email] = [item1, item2]
这样,您可以避免使用多个列表并大大简化您的代码。
添加回答
举报