пытается разобрать ячейку из кадра данных - PullRequest
0 голосов
/ 31 мая 2018

У меня есть фрейм данных, который состоит из нескольких выбранных столбцов из таблицы Excel.

xls_file = pd.ExcelFile('seedtestexcelbytask.xls') 
writer = ExcelWriter('DFExport.xls') 
df = xls_file.parse(usecols=[2, 3, 15])

Это небольшой пример фрейма данных

2         3         15
True      2/2/18    Seed 2 2in Holon, 83/1/2
True      2/3/18    Seed 1 1in Holon, 83/5
True      2/5/18    Seed 2 1.5in Holon, 26/1/2, 21/2, RW/1/2, H/7 

В столбце 15 содержатся разные значения, некоторые разделены пробелом, некоторые запятыми, а некоторые косой чертой.пример

Seed 2 1.5in Holon, 26/1/2, 21/2, RW/1/2, H/7 

В основном я пытаюсь переформатировать df, читая строку, удерживая значение даты в столбце 3, затем анализируя ячейку в строке в столбце 15 и разбивая эту ячейкудалее добавляя дату и некоторое значение в следующую строку

2/2/18    83     1
2/2/18    83     2
2/3/18    83     5
2/5/18    26     1
2/5/18    26     2
2/5/18    21     2
2/5/18    RW     1
2/5/18    RW     2
2/5/18     H     7 

Я пробовал варианты с xlrd и xlwt, но обнаружил, что просто продолжаю добавлять вложенные циклы, но я не думаю, что это наиболее эффективноспособ сделать это или это?Я нашел панд iterrows(), но мне трудно пытаться понять, как получить результат, который я хотел бы с этим.Я не думаю, что мне нужен какой-то код, который я могу копировать и вставлять, но, будучи новичком в Python, мне, очевидно, трудно правильно реализовать панд.Будучи новичком в Python, любые указатели будут великолепны !!

1 Ответ

0 голосов
/ 01 июня 2018

Вы можете попробовать это:

import pandas as pd
a = pd.DataFrame({2:['2/2/18','2/3/18','2/5/18'],3:['Seed 2 2in Holon, 83/1/2','Seed 1 1in Holon, 83/5','Seed 2 1.5in Holon, 26/1/2, 21/2, RW/1/2, H/7']})
a= pd.concat([pd.Series(row[2],row[3].split(',')) for _, row in a.iterrows()]).reset_index()
a= a[a['index'].str.contains('/')].reset_index(drop = True)
y = pd.DataFrame(a['index'].str.split('/',1).tolist(),columns = ['first','rest'])
y[0] = a[0]
df1 = pd.concat([pd.Series(row['first'],row['rest'].split('/')) for _, row in y.iterrows()]).reset_index()
df2 = pd.concat([pd.Series(row[0],row['rest'].split('/')) for _, row in y.iterrows()]).reset_index()
df1['date'] = df2[0]
print(df1)

Результат:

  index    0    date
0     1   83  2/2/18
1     2   83  2/2/18
2     5   83  2/3/18
3     1   26  2/5/18
4     2   26  2/5/18
5     2   21  2/5/18
6     1   RW  2/5/18
7     2   RW  2/5/18
8     7    H  2/5/18
...