我从不使用python,所以不确定如何解决这个问题。我有以下格式的excel / csv文件。我需要找到所有具有匹配IN_FID值的行,并将这些行输出到新文件的同一行中。
myfile.csv:
ROUTE_NAME CURR_VOL IN_FID NEAR_RANK
test11 test11 1 test11
test12 test12 1 test12
test2 test2 2 test2
test3 test3 3 test3
test31 test 3 test31
所需的输出:
IN_FID ROUTE_NAME1 NEAR_RANK1 ROUTE_NAME2 NEAR_RANK2
1 test11 test11 test12 test12
2 test2 test2 null null
3 test3 test3 test31 test31
我刚开始尝试使用python操作csv,但我想知道是否有像pandas这样的库会更好用?
#!/usr/bin/python
import csv
profile_to_search = input()
with open('myfile.csv', 'rt') as f:
reader = csv.reader(f, delimiter=',')
for row in reader:
if profile_to_search == row[2]:
print(row)
我走了这么远,然后才意识到我不知道自己在做什么。
答案 0 :(得分:2)
只是一个cumcount
就应该是简单的pivot
问题
df['Key']=df.groupby('IN_FID').cumcount()+1
s=df.pivot_table(index='IN_FID',columns='Key',values=['ROUTE_NAME','NEAR_RANK'],aggfunc='first')
s=s.sort_index(level=1,axis=1)
s.columns=s.columns.map('{0[0]}_{0[1]}'.format)
s
NEAR_RANK_1 ROUTE_NAME_1 NEAR_RANK_2 ROUTE_NAME_2
IN_FID
1 test11 test11 test12 test12
2 test2 test2 None None
3 test3 test3 test31 test31
答案 1 :(得分:1)
如果我了解您要查找的内容...假设您期望的输出缺少CURR_VOL
列:
# read your csv file
df = pd.read_csv(r'path\to\your\file.csv')
df['idx'] = df.groupby('IN_FID').cumcount()
# set index and unstack
new = df.set_index(['idx', 'IN_FID']).unstack(level=[0])
# list comprehension to create one column
new.columns = [f'{val}_{name}' for val, name in new.columns]
# output a new csv file
new.to_csv(r'some\path\to\new_file.csv')
ROUTE_NAME_0 ROUTE_NAME_1 CURR_VOL_0 CURR_VOL_1 NEAR_RANK_0 NEAR_RANK_1
IN_FID
1 test11 test12 test11 test12 test11 test12
2 test2 NaN test2 NaN test2 NaN
3 test3 test31 test3 test test3 test31
一种更有效的方法是使用map
:
# group with astype(str)
df['idx'] = df.groupby('IN_FID').cumcount().astype(str)
# set index and unstack
new = df.set_index(['idx', 'IN_FID']).unstack(level=[0])
# more efficient using map
new.columns = new.columns.map('_'.join)