查找所有具有匹配值的行,将所有匹配值输出到同一行

时间:2019-01-29 01:59:34

标签: python pandas csv

我从不使用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)

我走了这么远,然后才意识到我不知道自己在做什么。

2 个答案:

答案 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)