Подтвердить что ты не робот

Преобразование фрейма данных pandas в ряд

Я немного новичок в pandas. У меня есть кадр данных pandas, который содержит 1 строку на 23 столбца.

Я хочу преобразовать это в серию? Мне интересно, какой самый питонический способ сделать это?

Я пробовал pd.Series(myResults), но он жалуется ValueError: cannot copy sequence with size 23 to array axis with dimension 1. Он недостаточно умен, чтобы понять, что это все еще "вектор" в математических выражениях.

Спасибо!

4b9b3361

Ответ 1

Он не достаточно умен, чтобы понять его по-прежнему "вектор" в математических выражениях.

Скажите скорее, что он достаточно умен, чтобы распознать разницу в размерности.: -)

Я думаю, что самое простое, что вы можете сделать, это выбрать эту позицию с помощью iloc, которая дает вам серию со столбцами в качестве нового индекса и значения в качестве значений:

>>> df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])
>>> df
   a0  a1  a2  a3  a4
0   0   1   2   3   4
>>> df.iloc[0]
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64
>>> type(_)
<class 'pandas.core.series.Series'>

Ответ 2

Вы можете транспонировать однострочный фрейм данных (который все еще приводит к фрейму данных), а затем сжать результаты в серию (обратное to_frame).

df = pd.DataFrame([list(range(5))], columns=["a{}".format(i) for i in range(5)])

>>> df.T.squeeze()  # Or more simply, df.squeeze() for a single row dataframe.
a0    0
a1    1
a2    2
a3    3
a4    4
Name: 0, dtype: int64

Примечание: Чтобы учесть точку, поднятую @IanS (даже если это не вопрос OP), проверьте размер кадра данных. Я предполагаю, что df является фреймом данных, но крайние случаи - это пустой фрейм данных, фрейм данных формы (1, 1) и фрейм данных с более чем одной строкой, и в этом случае использование должно реализовать их желаемую функциональность.

if df.empty:
    # Empty dataframe, so convert to empty Series.
    result = pd.Series()
elif df.shape == (1, 1)
    # DataFrame with one value, so convert to series with appropriate index.
    result = pd.Series(df.iat[0, 0], index=df.columns)
elif len(df) == 1:
    # Convert to series per OP question.
    result = df.T.squeeze()
else:
    # Dataframe with multiple rows.  Implement desired behavior.
    pass

Это также можно упростить в соответствии с ответом, предоставленным @themachinist.

if len(df) > 1:
    # Dataframe with multiple rows.  Implement desired behavior.
    pass
else:
    result = pd.Series() if df.empty else df.iloc[0, :]

Ответ 4

Другой способ -

Предположим, myResult - это dataFrame, который содержит ваши данные в виде 1 столбца и 23 строк.

// label your columns by passing a list of names
myResult.columns = ['firstCol']

// fetch the column in this way, which will return you a series
myResult = myResult['firstCol']

print(type(myResult))

Аналогичным образом вы можете получить ряд из Dataframe с несколькими столбцами.

Ответ 5

data = pd.DataFrame({"a":[1,2,3,34],"b":[5,6,7,8]})
new_data = pd.melt(data)
new_data.set_index("variable", inplace=True)

Это дает фрейм данных с индексом в качестве имени столбца данных, и все данные присутствуют в столбце "значения"