Как разделить кортеж и сохранить его в датафрейме - PullRequest
2 голосов
/ 25 мая 2019

У меня есть список кортежей, подобный этому:

a=[('A7855', 'item1', 'item2'),('A7856', 'item3', 'item4', 'item5')]

, и я хочу сохранить этот список в кадре данных, например:

No    ID     itemNum
1     A7855  item1
2            item2
3     A7856  item3
4            item4
5            item5

Как мне решить эту проблему

Ответы [ 3 ]

2 голосов
/ 25 мая 2019

Также вы можете использовать melt здесь ::

df=(pd.DataFrame(a).melt(0,value_name='itemNum').
drop('variable',1).dropna().sort_values(0).rename(columns={0:'ID'}).reset_index(drop=True))
print(df)

      ID itemNum
0  A7855   item1
1  A7855   item2
2  A7856   item3
3  A7856   item4
4  A7856   item5

Чтобы соответствовать вашим точным требованиям, сделайте на df:

df.loc[df.duplicated('ID'),'ID']=''
df.insert(0,'No',range(1,len(df)+1))
print(df)

   No     ID itemNum
0   1  A7855   item1
1   2          item2
2   3  A7856   item3
3   4          item4
4   5          item5
1 голос
/ 25 мая 2019

Я предлагаю вам использовать множественное назначение переменных.Все переменные в кортеже после первой входят в "itemnum".

data=[('A7855', 'item1', 'item2'),('A7856', 'item3', 'item4', 'item5')]
rows = []
ids = set()
for idx, *itemnum in data:
    for i in itemnum:
        if idx in ids:
            idx = ''
        rows.append((idx, i))
        ids.add(idx)
df = pd.DataFrame(rows, columns=['ID','itemNum'])
df.index = [i+1 for i in df.index]

Мой вывод:

      ID itemNum
1  A7855   item1
2          item2
3  A7856   item3
4          item4
5          item5
1 голос
/ 25 мая 2019

Используйте понимание списка со сглаживанием и зациклите все значения без первого для списка кортежей, затем передайте его конструктору DataFrame:

b = [(x[0], y) for x in a for y in x[1:]]
df = pd.DataFrame(b, columns=['ID','itemNum'])
print (df)
      ID itemNum
0  A7855   item1
1  A7855   item2
2  A7856   item3
3  A7856   item4
4  A7856   item5

Если нужны только первые значения для ID, добавьте столбец if-else оператор с перечислением для счетчика списков:

b = [(x[0], y) if i == 0 
               else ('', y) 
               for x in a for i, y in enumerate(x[1:])]
df = pd.DataFrame(b, columns=['ID','itemNum'])
print (df)
      ID itemNum
0  A7855   item1
1          item2
2  A7856   item3
3          item4
4          item5

И при необходимости новый столбец No добавить DataFrame.insert для добавления первого нового столбца со значениями индекса + 1:

df.insert(0, 'No', df.index + 1)
print (df)
   No     ID itemNum
0   1  A7855   item1
1   2          item2
2   3  A7856   item3
3   4          item4
4   5          item5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...