【问题标题】:removing multiple occurrence from csv in python从python中的csv中删除多次出现
【发布时间】:2020-05-04 06:20:54
【问题描述】:

我有一个 CSV 文件,我必须从中创建另一个特定格式的 CSV。我正在共享我的输入 CSV 和输出 CSV 文件(我通过我的代码获得)和所需的输出 CSV 格式。请帮助我实现这一目标。 输入样本文件:

MSISDN,REQUEST_ID,STATE1,STATE2,STAETE3,NOTIFICATION
22969000034,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,ENTERED,NA,NA,NA
22969000034,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,NA,IN_PROGRESS,NA,NA
22969000034,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,NA,NA,COMPLETED,Successfully send SMS to the subscriber
22969000035,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,ENTERED,NA,NA,NA
22969000035,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,NA,IN_PROGRESS,NA,NA
22969000035,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,NA,NA,COMPLETED,Successfully send SMS to the subscriber
22969000036,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,ENTERED,NA,NA,NA
22969000036,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,NA,IN_PROGRESS,NA,NA
22969000037,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,ENTERED,NA,NA,NA

输出样本数据:

('22969000034', 'OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27', 'ENTERED', 'NA', 'NA', 'NA')
('22969000034', 'OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27', 'ENTERED', 'IN_PROGRESS', 'NA', 'NA')
('22969000034', 'OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27', 'ENTERED', 'IN_PROGRESS', 'COMPLETED', 'Successfully send SMS to the subscriber')
('22969000035', 'OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27', 'ENTERED', 'NA', 'NA', 'NA')
('22969000035', 'OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27', 'ENTERED', 'IN_PROGRESS', 'NA', 'NA')
('22969000035', 'OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27', 'ENTERED', 'IN_PROGRESS', 'COMPLETED', 'Successfully send SMS to the subscriber')
('22969000036', 'OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27', 'ENTERED', 'NA', 'NA', 'NA')
('22969000036', 'OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27', 'ENTERED', 'IN_PROGRESS', 'NA', 'NA')
('22969000037', 'OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27', 'ENTERED', 'NA', 'NA', 'NA')

所需样本数据:

('22969000034', 'OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27', 'ENTERED', 'IN_PROGRESS', 'COMPLETED', 'Successfully send SMS to the subscriber')
('22969000035', 'OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27', 'ENTERED', 'IN_PROGRESS', 'COMPLETED', 'Successfully send SMS to the subscriber')
('22969000036', 'OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27', 'ENTERED', 'IN_PROGRESS', 'NA', 'NA')
('22969000037', 'OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27', 'ENTERED', 'NA', 'NA', 'NA')

我正在使用以下代码:

with open('msLog.csv', 'r') as readfile:
    output = csv.DictReader(readfile)
    f_list = []
    msd = ''
    id = ''
    st1 = ''
    st2 = ''
    st3 = ''
    txt = ''
    for row in output:
        msd1 = row.get('MSISDN')
        if msd1 and row.get('STAETE3') != 'NA' and row.get('NOTIFICATION') != 'NA':
            msd = msd1
            id = row.get('REQUEST_ID')
            st3 = row.get('STAETE3')
            txt = row.get('NOTIFICATION')
        elif msd1 and row.get('STAETE3') == 'NA' and row.get('STATE1') =='NA':
            st2 = row.get('STATE2')
            id = row.get('REQUEST_ID')
            msd = msd1
            #st1 = 'NA'
            st3 = 'NA'
            txt = 'NA'
        elif msd1 and row.get('STAETE3') == 'NA' and row.get('STATE2') =='NA':
            st1 = row.get('STATE1')
            id = row.get('REQUEST_ID')
            msd = msd1
            st2 = 'NA'
            st3 = 'NA'
            txt = 'NA'
        print(msd,id,st1,st2,st3,txt)

【问题讨论】:

  • 请说出您的问题,您刚刚发布了所需的输出,但没有说明如何获得该输出。

标签: python csv dictionary


【解决方案1】:

在 pandas 中使用表格数据快速了解情况,这将为您节省大量时间。 我将您的数据粘贴到名为 so.csv 的文件中。然后,您可以将该文件读入 pandas 数据帧,按 MSISDN 分组,并取每组的最后一个,分两行:

import pandas as pd
df = pd.read_csv('Documents/so.csv',sep=',')
df.groupby('MSISDN').last()
Out[43]:
                                                    REQUEST_ID   STATE1       STATE2    STAETE3                             NOTIFICATION
MSISDN
22969000034  OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef...  ENTERED  IN_PROGRESS  COMPLETED  Successfully send SMS to the subscriber
22969000035  OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef...  ENTERED  IN_PROGRESS  COMPLETED  Successfully send SMS to the subscriber
22969000036  OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef...  ENTERED  IN_PROGRESS        NaN                                      NaN
22969000037  OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef...  ENTERED          NaN        NaN                                      NaN

【讨论】:

  • 我正在使用 python 2.7 并且没有 pandas 模块,我尝试安装它但没有获得相关模块。有没有其他方法可以解决这个问题?
  • 你试过pip install pandas 吗?我鼓励你“使用免费的法拉利”而不是重新发明轮子
  • 我收到错误“pandas.errors.EmptyDataError: No columns to parse from file”。我尝试使用逗号和 \t sep。在这两种情况下,我都会遇到同样的错误。
  • 您确定在正确的位置有一个名称与您要读取的文件相同的文件吗?我所做的只是将您帖子第一部分中的文本复制粘贴到没有格式的文本文件中,并将其命名为so.csv - 听起来您的文件可能是一个空文件?
【解决方案2】:

纯 Python2。

构建一个字典,扫描数据以查找相同 ID 下的更新条目,输出标题,并逐个 ID 输出字典。

注意:我知道 Python3 dicts 尊重形成顺序,我认为 Python2 dicts,对于最近的 Python2,做同样的事情,但为了安全起见,我使用了 sorted 内置函数ID 按字典顺序排序,删除sorted 或引入key 函数,您认为合适...

$ cat na.py
from __future__ import print_function

data = '''MSISDN,REQUEST_ID,STATE1,STATE2,STATE3,NOTIFICATION 
22969000034,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,ENTERED,NA,NA,NA 
22969000034,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,NA,IN_PROGRESS,NA,NA 
22969000034,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,NA,NA,COMPLETED,Successfully send SMS to the subscriber 
22969000035,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27 ,ENTERED,NA,NA,NA 
22969000035,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,NA,IN_PROGRESS,NA,NA 
22969000035,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,NA,NA,COMPLETED,Successfully send SMS to the subscriber 
22969000036,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,ENTERED,NA,NA,NA 
22969000036,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,NA,IN_PROGRESS,NA,NA 
22969000037,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,ENTERED,NA,NA,NA\
'''.split('\n') 

# alternatively, if data in external file, file=open(fname)
file = iter(data)

d = {}
header = next(file)

for data in ([tok.strip() for tok in line.split(',')] for line in file):
    id, rest = data[0], data[1:]
    if id in d:
        for n, (old, new) in enumerate(zip(d[id], rest)):
            if old == new: pass
            elif old != 'NA':
                rest[n] = old
    d[id] = rest

print(header)
for id, rest in sorted(d.items()): print(id, *rest, sep=',')
$ python2 na.py
MSISDN,REQUEST_ID,STATE1,STATE2,STATE3,NOTIFICATION 
22969000034,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,ENTERED,IN_PROGRESS,COMPLETED,Successfully send SMS to the subscriber
22969000035,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,ENTERED,IN_PROGRESS,COMPLETED,Successfully send SMS to the subscriber
22969000036,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,ENTERED,IN_PROGRESS,NA,NA
22969000037,OFFLINE_Notification_10.10.46.95_e6444dbc-b7ef-41d6-9111-eaa384717b27,ENTERED,NA,NA,NA
$ 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多