Python 3: Создайте переменную, анализируя кадр данных pandas - PullRequest
0 голосов
/ 02 марта 2019

У меня есть следующий кадр данных со столбцами id, start, end, name:

A   7   340 string1
B   12  113 string2
B   139 287 string3
B   301 348 string4
B   379 434 string5
C   41  73  string6
C   105 159 string7

, и я читаю это в python3, используя pandas:

import pandas
df = pandas.read_csv("table", comment="#", header=None, names=["id", "start", "end", "name"])

Теперь мне нужно разобрать df и извлечь для каждого id start, end и name в список следующего формата:

mylist = [GraphicFeature(start=XXX, end=YYY, color="#ffffff", label="ZZZ")]

XXX здесь start, YYY - end, ZZZ - «имя».Таким образом, список содержит столько элементов, сколько строк в id.GraphicFeature - это просто имя члена модуля.

Я думал о циклическом цикле передачи данных следующим образом:

uniq_val = list(df["id"].unique())
for i in uniq_val:
    extracted = df.loc[df["id"] == i]

Но как мне построить mylist?(После построения списка будут некоторые другие команды построения).

Поэтому мой ожидаемый «результат» в цикле:

для идентификатора A:

mylist = [GraphicFeature(start=7, end=340, color="#ffffff", label="string1")]

для идентификатора B:

mylist = [GraphicFeature(start=12, end=113, color="#ffffff", label="string2"), GraphicFeature(start=139, end=287, color="#ffffff", label="string3"), GraphicFeature(start=301, end=348, color="#ffffff", label="string4"), GraphicFeature(start=379, end=434, color="#ffffff", label="string5")]

для идентификатора C:

mylist = [GraphicFeature(start=41, end=73, color="#ffffff", label="string6"), GraphicFeature(start=105, end=159, color="#ffffff", label="string7")]

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Использование для цикла

l=[[GraphicFeature(start=x[0], end=x[1], color="#ffffff", label=x[2])for x in zip(y.start,y.end,y.name) ] for _,y in df.groupby('id')]
0 голосов
/ 02 марта 2019

Один из подходов состоит в том, чтобы позволить

mylists = df.groupby('id').apply(lambda group: group.apply(lambda row: GraphicFeature(start=row['start'], end=row['end'], color='#ffffff', label=row['name']), axis=1).tolist())

Немного излагая это, заметьте, что операции с пандами обычно наиболее аккуратно сочетаются друг с другом, если использовать подход функционального программирования;мы хотим превратить каждую строку в GraphicFeature, и, в свою очередь, мы хотим превратить каждую группу строк с одинаковым id в список GraphicFeature.Таким образом, вышеприведенное также может быть расширено до

def row_to_graphic_feature(row):
    return GraphicFeature(start=row['start'], end=row['end'], color='#ffffff', label=row['name'])

def id_group_to_list(group):
    return group.apply(row_to_graphic_feature, axis=1).tolist()

mylists = df.groupby('id').apply(id_group_to_list)

с данными вашего примера:

In [38]: df
Out[38]:
  id  start  end     name
0  A      7  340  string1
1  B     12  113  string2
2  B    139  287  string3
3  B    301  348  string4
4  B    379  434  string5
5  C     41   73  string6
6  C    105  159  string7

In [39]: mylists = df.groupby('id').apply(id_group_to_list)

In [40]: mylists['A']
Out[40]: [GraphicFeature(start=7, end=340, color='#ffffff', label='string1')]

In [41]: mylists['B']
Out[41]:
[GraphicFeature(start=12, end=113, color='#ffffff', label='string2'),
 GraphicFeature(start=139, end=287, color='#ffffff', label='string3'),
 GraphicFeature(start=301, end=348, color='#ffffff', label='string4'),
 GraphicFeature(start=379, end=434, color='#ffffff', label='string5')]

In [42]: mylists['C']
Out[42]:
[GraphicFeature(start=41, end=73, color='#ffffff', label='string6'),
 GraphicFeature(start=105, end=159, color='#ffffff', label='string7')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...