【问题标题】:Gather for each unique ids all values from csv in python在 python 中为每个唯一的 id 收集来自 csv 的所有值
【发布时间】:2018-10-24 23:05:45
【问题描述】:

我有一个这样的数据集:

id,LON,LAT
00x1,2.17105,41.31353
00x1,1.935983,41.04712
00x2,-5.381285,36.11647
00x2,0.830717,42.19835
00x1,10.21912,43.51599

并且我希望每个唯一的 id 以表格形式收集 LAT、LON 列(预期输出):

[00x1, [2.17105,41.31353], [1.935983,41.04712], [10.21912,43.51599]]
[00x2, [-5.381285,36.11647], [0.830717,42.19835]]

到目前为止我的代码:

 df = pd.read_csv('/home/repos/master/testdat.csv')
 ids = []
 ids.append((df.as_matrix(columns=['id'])))
 #find unique ids
 unique_ids  =  np.unique(ids)
 coordinates = (df.as_matrix(columns=['LON', 'LAT']))

访问所有 id 和坐标,但我不知道如何实现预期的输出。

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    使用 Pandas,可以将 2 个系列组合成一系列列表,与 GroupBy 聚合,然后使用列表推导。给定一个数据框df

    df['LON-LAT'] = list(map(list, zip(df['LON'], df['LAT'])))
    grouped = df.groupby('id')['LON-LAT'].apply(list)
    
    res = [[k, *v] for k, v in grouped.items()]
    

    结果:

    [['00x1',
      [2.1710500000000001, 41.31353],
      [1.9359830000000002, 41.04712],
      [10.21912, 43.515990000000002]],
     ['00x2',
      [-5.3812850000000001, 36.11647],
      [0.83071700000000004, 42.198349999999998]]]
    

    【讨论】:

      【解决方案2】:

      您可以使用 csv.DictReader 来处理文件并使用另一个字典来保存数据。最后将字典转换为列表。 我认为这会比使用 pandas 容易得多。

      import csv
      d = {}
      with open('testdat.csv') as csvfile:
          reader = csv.DictReader(csvfile)
          for row in reader:
              d[row['id']] = d.get(row['id'], []) + [[row['LON'], row['LAT']]]
      res = [[key] + value for key, value in d.items()]
      print(res)
      

      【讨论】:

      • 好的,太好了。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-07
      • 2015-09-03
      • 2023-04-03
      相关资源
      最近更新 更多