Проанализируйте строку поплавков в Python

#python #pandas #dataframe

Вопрос:

 list=[['10, 0.01, 0.0428, 120; 30, 0.1, 2, 33; 50, 0.023, 0.31, 0.65'],
      ['10, 0.7, 0.5428, 2.31'],
      ['50, 0.3, 0.35, 0.1'],
      ['-10, 0.2, 0.048, 124; -30, 0.11, 24, 3; -50, 0.02, 0.1, 0.60; 0, 0, 0, 0; 10, 0.1, 2, 33; 
       20, 0.023, 0.31, 0.66']]

df=pd.DataFrame(list)
 

У меня есть фрейм данных df, из которого я пытаюсь получить 3-е значение после каждого знака с запятой, если имя столбца совпадает с 1-м значением после знака с запятой. Ожидаемый результат выглядит следующим образом. Есть какие-нибудь подсказки о том, как решить эту проблему простым способом?

введите описание изображения здесь

Комментарии:

1. Во 2-й и 3-й строках нет точки с запятой.

2. В этом случае просто нужно принять 3-е значение

3. Как вы получили этот список? Да, вы можете проанализировать поплавки, но вы, вероятно, захотите исправить исходный код

4. Я не думаю, что понимаю вопрос ?

5. @juanpa.arrivillaga фактические данные представляют собой фрейм данных из 1000 строк, сохраненных локально в моей системе, я скопировал несколько строк в списке, чтобы люди могли скопировать и попробовать в своей системе

Ответ №1:

Используйте вложенные циклы:

 d = {}
for r, i in enumerate(l):
    for j in i[0].split(';'):
        k = j.split(',')
        c, v = int(k[0]), float(k[2])
        d[(r, c)] = v

df = pd.Series(d).unstack(fill_value=0)
 

Выход:

 >>> df
   -50   -30    -10   0       10    20   30    50
0  0.0   0.0  0.000  0.0  0.0428  0.00  2.0  0.31
1  0.0   0.0  0.000  0.0  0.5428  0.00  0.0  0.00
2  0.0   0.0  0.000  0.0  0.0000  0.00  0.0  0.35
3  0.1  24.0  0.048  0.0  2.0000  0.31  0.0  0.00
 

Комментарии:

1. ОП хочет получить третий пункт, а именно k[2] !

2. @ddejohn Ты действительно уделяешь больше внимания, чем мне 🙂 Спасибо.

3. @РахулКумар. Я обновил свой ответ. Не могли бы вы проверить это, пожалуйста?

4. Ты всегда отвечаешь на волосок быстрее меня, лол, это меньшее, что я могу сделать, чтобы отомстить тебе за то, что ты опередил меня.

5. @ddejohn. Я больше не буду этого делать, обещаю 🙂