我有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号,然后是移动和密码。
答案 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
以使用正则表达式。