Создание массива из значений в нескольких столбцах без значений NaN - PullRequest
0 голосов
/ 26 мая 2018

У меня в настоящее время есть фрейм данных, который выглядит следующим образом:

         col1              col2            col3
0  (10.213,-20.23)   (120.1,-300.23)   (111.0, -231.1)
1  (11.22,-22.33)    (123.1,-302.23)   (nan, nan)
2  (122.22,-22.44)   (nan,nan)         (nan, nan)

Я пытаюсь добавить все наборы в разные столбцы, но НЕ наборы нан.Таким образом, результат будет примерно таким:

                          col1              
0  ((10.213,-20.23),(120.1,-300.23),(111.0, -231.1))
1  ((11.22,-22.33),(123.1,-302.23)) 
2  (122.22,-22.44) 

Любые идеи, пожалуйста?

Спасибо

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Более или менее векторизованная версия:

df[df.applymap(sum).notnull()].stack().groupby(level=0).apply(tuple)

Вывод:

0    ((10.213, -20.23), (120.1, -300.23), (111.0, -...
1                  ((11.22, -22.33), (123.1, -302.23))
2                                  ((122.22, -22.44),)
dtype: object

Идея:

In [727]: q.df2.applymap(sum).notnull()
Out[727]: 
   col1   col2   col3
0  True   True   True
1  True   True  False
2  True  False  False

In [728]: q.df2[q.df2.applymap(sum).notnull()]
Out[728]: 
               col1              col2             col3
0  (10.213, -20.23)  (120.1, -300.23)  (111.0, -231.1)
1   (11.22, -22.33)  (123.1, -302.23)              NaN
2  (122.22, -22.44)               NaN              NaN

In [729]: q.df2[q.df2.applymap(sum).notnull()].stack()
Out[729]: 
0  col1    (10.213, -20.23)
   col2    (120.1, -300.23)
   col3     (111.0, -231.1)
1  col1     (11.22, -22.33)
   col2    (123.1, -302.23)
2  col1    (122.22, -22.44)
dtype: object


In [730]: q.df2[q.df2.applymap(sum).notnull()].stack().groupby(level=0).apply(tuple)
Out[730]: 
0    ((10.213, -20.23), (120.1, -300.23), (111.0, -...
1                  ((11.22, -22.33), (123.1, -302.23))
2                                  ((122.22, -22.44),)
dtype: object
0 голосов
/ 26 мая 2018

Это один из способов использования массива numpy в массиве данных и последующего присвоения списка списков одной серии.

Сложная задача - отфильтровать NaN кортежей;для этого мы можем использовать filter:

df = pd.DataFrame([[(10.213, -20.23), (120.1, -300.23), (111.0, -231.1)],
                   [(11.22, -22.33), (123.1, -302.23), (np.nan, np.nan)],
                   [(122.22, -22.44), (np.nan, np.nan), (np.nan, np.nan)]],
                  columns=['col1', 'col2', 'col3'])

res = pd.DataFrame({'col1': [list(filter(lambda x: any(pd.notnull(j) for j in x), i))
                             for i in df.values.tolist()]})

print(res)

                                                col1
0  [(10.213, -20.23), (120.1, -300.23), (111.0, -...
1                [(11.22, -22.33), (123.1, -302.23)]
2                                 [(122.22, -22.44)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...