python - 两个 CSV 文件,将一行中的一对与第二个 CSV 文件中的匹配值匹配,在由相同类型的值组成的单个列中
问题描述
我有两个 CSV 文件,我想将一行(循环通过 n 行)中的一对(一组两个)相同类型的 int 值与第二个 CSV 文件中的匹配值相匹配,该列包含重复的相同类型的值。
到目前为止,我写了这段代码,但它非常耗时,也许这个问题有pythonic捷径?
c1=0
c2=0
def append_list_as_row(file_name, list_of_elem):
# Open file in append mode
with open(file_name, 'a+', newline='') as write_obj:
# Create a writer object from csv module
csv_writer = writer(write_obj)
# Add contents of list as last row in the csv file
csv_writer.writerow(list_of_elem)
pairs = pd.read_csv('pairs.csv',delimiter=';')
df = pd.read_csv('02_Data_test.csv',delimiter=',')
foo = open('foo.csv', 'w')
with open('foo.csv', 'w', newline='') as outcsv:
writer1 = csv.DictWriter(outcsv, fieldnames = ["##","lac","cid","msisdn","imei","event_type","tstamp","long","lat","max_dist","cell_type","start_angle","end_angle","msisdn1"])
writer1.writeheader()
for i in range(0,122,1): #range(len(pairs)):
for j in range(0,174123,1): #range(len(df)):
if pairs.iloc[i,0]==df.iloc[j,3]:
c1+=1
print(i)
append_list_as_row('foo.csv', df.iloc[j,:])
if pairs.iloc[i,1]==df.iloc[j,3]:
c2+=1
print(i)
print(j)
print("")
append_list_as_row('foo.csv', df.iloc[j,:])
#if pairs.iloc[i,1]==df.iloc[j,3]:
# c2+=1
# print(i)
# print(j)
#append_list_as_row('foo.csv', df.iloc[j,:])
print("------------------------")
append_list_as_row('foo.csv', "")
解决方案
您可以使用 pandas.DataFrame 的 pd.isin([list]) 函数从 CSV2 中提取数据,该数据属于 CSV1 中的一对msisdn
数字
样本输入
pairs
msisdn1 msisdn2
msisdn1 msisdn11
msisdn2 msisdn12
msisdn3 msisdn13
msisdn4 msisdn14
msisdn5 msisdn15
data
test moretest no_test msisdn
test1 moretest1 no_test1 msisdn1
test2 moretest2 no_test2 msisdn2
test3 moretest3 no_test3 msisdn3
test4 moretest4 no_test4 msisdn4
test5 moretest5 no_test5 msisdn5
test6 moretest6 no_test6 msisdn6
test7 moretest7 no_test7 msisdn7
test8 moretest8 no_test8 msisdn8
test9 moretest9 no_test9 msisdn9
test10 moretest10 no_test10 msisdn10
test11 moretest11 no_test11 msisdn11
test12 moretest12 no_test12 msisdn12
test13 moretest13 no_test13 msisdn13
test14 moretest14 no_test14 msisdn14
test15 moretest15 no_test15 msisdn15
test16 moretest16 no_test16 msisdn16
test17 moretest17 no_test17 msisdn17
test18 moretest18 no_test18 msisdn18
test19 moretest19 no_test19 msisdn19
test20 moretest20 no_test20 msisdn20
代码:
csv1 = pd.read_csv('pairs.csv')
csv1 = pd.read_csv('02_Data_test.csv')
# res is a list that will hold all the extracted rows
# and we will finally append all results into a DataFrame
res = []
for pairs in csv1.values.tolist():
res.append(csv2[csv2['msisdn'].isin(pairs)])
df = pd.concat(res)
df.to_csv('result.csv', index=False)
样本输出
test moretest no_test msisdn
0 test1 moretest1 no_test1 msisdn1
10 test11 moretest11 no_test11 msisdn11
1 test2 moretest2 no_test2 msisdn2
11 test12 moretest12 no_test12 msisdn12
2 test3 moretest3 no_test3 msisdn3
12 test13 moretest13 no_test13 msisdn13
3 test4 moretest4 no_test4 msisdn4
13 test14 moretest14 no_test14 msisdn14
4 test5 moretest5 no_test5 msisdn5
14 test15 moretest15 no_test15 msisdn15
希望这可以帮助。
推荐阅读
- c - 更改后自动重新编译C程序?
- python - 更改 base64 字符串并将其保存为图像
- c# - 在streamreader c#中按过滤器搜索
- ios - 隐藏视图后如何更新布局
- android - 不适用于 Oreo 8.1 的小部件案例 - 收到消息:W/BroadcastQueue:不允许后台执行:接收 Intent
- angular - 如何通过外部翻译 url 在 ionic 3 中使用 ngx translate
- angular - forwardRef 在角度上有什么作用?
- angular - 显示已在 Angular 5 中作为 Blob 对象接收的图像
- javascript - 如果我在 react-select 中使用 optionsRenderer,如何使用 valueComponent 道具呈现所选项目
- python - 如何将熊猫框架值中的问号替换为缺失值?