Почему мои панды DataFrame столбцы тоже Dataframes, а не серии? - PullRequest
0 голосов
/ 08 января 2019

Обновление в конце Обновление 2 в конце

Я прочитал отсюда: получить список из столбца данных pandas

Столбцы Pandas DataFrame относятся к серии Pandas, когда вы их извлекаете

Однако в моем случае это не так:

Первая часть (создание DataFrame для чтения json scraped) Поскольку он содержит бизнес-информацию, я не могу показать полный код, но в основном он читает одну строку данных (хранится в серии) и добавляет в конце DataFrame.

dfToWrite = pandas.DataFrame(columns=[lsHeader]) # Empty with column headers
for row in jsAdtoolJSON['rows']:
    lsRow = []
    for col in row['row']:
        lsRow.append((col['primary'])['value'])
    dfRow = pandas.Series(lsRow, index = dfToWrite.columns)
dfToWrite = dfToWrite.append(dfRow, ignore_index = True)

Следующая часть (тип проверки): (Пожалуйста, игнорируйте функциональность функции)

def CalcMA(df: pandas.DataFrame, target: str, period: int, maname: str):
    print(type(df[target]))

Наконец, вызовите функцию: ("Raw_Impressions" - заголовок столбца)

CalcMA(dfToWrite, "Raw_Impressions", 5, "ImpMA5")

Консоль Python показывает:

класс 'pandas.core.frame.DataFrame'

Дополнительный вопрос : Как получить список из столбца Dataframe, если это не серия (в этом случае я могу использовать tolist())?

Обновление 1 Отсюда: Bokeh: AttributeError: объект 'DataFrame' не имеет атрибута 'tolist'

Я понял, что мне нужно использовать .value.tolist(), однако это все еще не объясняет, почему я получаю другой Dataframe, а не Series, когда я вытаскиваю столбец.

Обновление 2 Обнаружил, что у df есть MultiIndex, очень удивился:

MultiIndex (уровни = [['COST _ / CPM', 'CTR', 'ECPM / _ ROI', 'Goal_Ratio', 'Hour_of_the_Day', 'IMP./Joins', 'Raw_Clicks _ / _ Unique_Clicks ',' Raw_Impressions ',' Unique_Goal _ / _ UniqueGoal_Forecasted_Value ']], метки = [[4, 7, 5, 6, 1, 8, 3, 0, 2]])

Я не вижу labels при распечатке df / записи в .csv, это просто обычный DataFrame. Не уверен, где я взял этикетки.

Ответы [ 2 ]

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

Я думаю, что у вас есть дублированные имена столбцов, поэтому, если хотите, выберите Series get DataFrame:

df = pd.DataFrame([[1,2],[4,5], [7,8]], index=list('aab')).T
print (df)
   a  a  b
0  1  4  7
1  2  5  8

print (df['a'])
   a  a
0  1  4
1  2  5

print (type(df['a']))
<class 'pandas.core.frame.DataFrame'>

print (df['b'])
0    7
1    8
Name: b, dtype: int64

print (type(df['b']))
<class 'pandas.core.series.Series'>

EDIT:

Вот еще одна проблема, один уровень MultiIndex, решение - переназначить первый уровень обратно на столбцы с get_level_values:

mux = pd.MultiIndex([['COST_/CPM', 'CTR', 'ECPM/_ROI', 'Goal_Ratio', 'Hour_of_the_Day', 
                      'IMP./Joins',  'Raw_Clicks_/_Unique_Clicks', 'Raw_Impressions',
                      'Unique_Goal_/_UniqueGoal_Forecasted_Value']], 
labels=[[4, 7, 5, 6, 1, 8, 3, 0, 2]])

df = pd.DataFrame([range(9)], columns=mux)
print (type(df['CTR']))
<class 'pandas.core.frame.DataFrame'>

df.columns = df.columns.get_level_values(0)
print (type(df['CTR']))
<class 'pandas.core.series.Series'>
0 голосов
/ 08 января 2019

Каждый экземпляр pandas.core.frame.DataFrame в основном является массивом, поэтому, если вы получаете этот тип, вы можете получить каждый столбец (который, если столбец является 1-мерным, будет иметь тип pandas.core.series.Series), вызвав df.columns.

df.columns предоставит вам итеративный объект, который вы можете перебрать, чтобы получить значения в каждой строке.

Возможно, вы захотите взглянуть на pandas.read_json или другой подобный пакет, просто чтобы получить json непосредственно в объекте pandas, которым может быть проще управлять

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...