Возврат pandas.DataFrame, когда срез имеет один результат строки - PullRequest
0 голосов
/ 15 января 2019

Рассмотрим следующее:

>>> import numpy as np
>>> import pandas as pd
>>> df = pd.DataFrame(np.random.randn(5, 2), index=[100, 101, 101, 102, 103])
>>> idx = set(df.index)
>>> for id_ in idx:
...     slice = df.loc[id_]
...     # stuff with slice
>>>

Мне нужно сделать что-то с slice в цикле for, но этот материал основан на slice, равном DataFrame. slice - это DataFrame, если имеется более одной совпадающей записи, но Series в противном случае. Я знаю, что pandas.Series имеет метод Series.to_frame, но pandas.DataFrame нет (поэтому я не могу просто вызвать df.loc[id_].to_frame()).

Каков наилучший способ проверки и приведения slice в DataFrame?

(это действительно так же просто, как тестирование, если isinstance(df.loc[id_], pd.Series)?)

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Или используйте df[...] Кондиционирование df.index:

...
for id_ in idx:
     slice = df[df.index==id_]
     print(slice)

Выход:

            0         1
100  2.751189  1.978744
            0         1
101  0.154483  1.646657
101  1.381725  0.982819
           0         1
102  0.26669  0.032702
            0         1
103  0.186235 -0.481184
0 голосов
/ 15 января 2019

Вы можете сделать так, чтобы срез переменной представлял собой фрейм данных pandas, используя метод инициализации pd.Dataframe следующим образом:

for id_ in idx:
    slice = pd.DataFrame(df.loc[id_])
    print(type(slice))

выход:

<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>

Тогда вы можете обрабатывать переменные как циклы данных внутри цикла.

0 голосов
/ 15 января 2019

Вы можете выполнить цикл по groupby объекту по индексу (level=0):

for i, df1 in df.groupby(level=0):
    print (df1)

            0         1
100 -0.812375 -0.450793
            0         1
101  1.070801  0.217421
101 -1.175859 -0.926117
            0         1
102 -0.993948  0.586806
            0         1
103  1.063813  0.237741

Ваше решение следует изменить, выбрав double [] для возврата DataFrame:

idx = set(df.index)
for id_ in idx:
    df1 = df.loc[[id_]]
    print (df1)

            0         1
100 -0.775057 -0.979104
            0         1
101 -1.549363 -1.206828
101  0.445008 -0.173086
            0        1
102  1.488947 -0.79252
            0         1
103  1.838997 -0.439362
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...