重新排列CSV数据

时间:2014-05-04 13:20:02

标签: python csv

我有2个不同列的csv文件。对于例如第一个文件以10位数的移动号码开头,而该列在第二个文件中的号码为4。 我需要将所有客户数据合并到一个csv文件中。列的顺序应如下:

mobile pincode model Name Address Location pincode date

mobile  Name    Address Model   Location    pincode Date
9845299999  Raj Shah    nagar No 22 Rivi Building 7Th Main I    Crz Mumbai      17/02/2011
9880877777  Managing Partner M/S Aitas  # 1010, 124Th Main, Bk Stage.  -    Bmw 320 D   Hyderabad   560070  30-Dec-11


Name    Address Location    mobile  pincode Date    Model   
Asvi Developers pvt Ltd fantry Road Nariman Point, 1St Floor, No. 150   Chennai 9844066666      13/11/2011  Crz 
L R Shiva Gaikwad & Sudha Gaikwad   # 42, Suvarna Mansion, 1St Cross, 17Th Main, Banjara Hill, B S K Stage,-    Bangalore   9844233333  560085  40859   Mercedes_E 350 Cdi  

第二个任务可能有点困难,因为预期的新文件可能具有完全不同的列序列。在那种情况下,我需要提取10位数的手机号码和6位数的pincode列。如果它与任何给定的城市列表匹配,我需要编写猜测城市列的代码。新文件应具有相关的列标题,但列标题可能略有不同。例如"客户地址"而不是"地址"。我该如何处理这些数据?

sed 's/.*\([0-9]\{10\}\).*/\1,&/' input

我被建议使用sed重新排列开头的10位数列。但我还需要重新排列文本列。对于例如如果列与以下列表中的条目匹配,那么它无疑是模型列。

['Crz', 'Bmw 320 D', 'Benz', 'Mercedes_E 350 Cdi', 'Toyota_Corolla He 1.8']

如果任何列与上面列表中10%的条目相匹配,那么它就是"模型"列,应该是3号,然后是移动和密码。

1 个答案:

答案 0 :(得分:1)

对于你的第一个问题,我建议使用pandas加载这两个文件然后连接。之后,您可以重新排列列。

import pandas as pd
dataframe1 = pd.read_csv('file1.csv')
dataframe2 = pd.read_csv('file2.csv')
combined = pd.concat([dataframe1, dataframe2]) #the columns will be ordered alphabetically

要获得所需的订单,

result_df = combined[['mobile', 'pincode', 'model', 'Name', 'Address', 'Location', 'pincode', 'date']]

然后result_df.to_csv('oupput.csv', index=False)导出到csv文件。

对于第二个,您可以执行类似的操作(假设您已将csv文件加载到df中,如上所述)

match_model = lambda m: m in ['Crz', 'Bmw 320 D', 'Benz', 'Mercedes_E 350 Cdi',   'Toyota_Corolla He 1.8']

for c in df:
    if df[c].map(match_model).sum()/len(df) > 0.1:
        print "Column %s is 'Model'"% c
        df.rename(columns={c:'Model'}, inplace=True)

如果需要,您可以修改匹配函数match_model以使用正则表达式。