python - 为什么我的 pandas DataFrame 列也是 Dataframes,而不是 Series?

标签 python pandas dataframe

最后更新 最后更新2

我从这里读到: get list from pandas dataframe column

Pandas DataFrame columns are Pandas Series when you pull them out

但是在我的情况下这不是真的:

第一部分(构建读取 json 抓取的 DataFrame) 因为它包含业务信息,所以我无法显示完整代码,但基本上它会读取一行数据(存储在系列中)并附加到 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 控制台显示:

class 'pandas.core.frame.DataFrame'

其他问题:如果 Dataframe 列不是系列(在这种情况下我可以使用 tolist())如何从 Dataframe 列中获取列表?

更新 1 从这里: Bokeh: AttributeError: 'DataFrame' object has no attribute 'tolist'

我发现我需要使用 .value.tolist(),但是它仍然没有解释为什么我在拉出一列时得到另一个 Dataframe,而不是 Series。

更新 2 发现df有MultiIndex,很惊讶:

MultiIndex(levels=[['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/写入 .csv 时,我没有看到 labels,它只是一个普通的 DataFrame。不确定我从哪里得到标签。

最佳答案

我认为您有重复的列名,所以如果要选择 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'>

编辑:

这是另一个问题,一个级别 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'>

关于python - 为什么我的 pandas DataFrame 列也是 Dataframes,而不是 Series?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54085939/

相关文章:

python - 无法删除由 `tempfile.mkstemp()` 在 Windows 上创建的文件

python - Pandas:使用重复值进行透视

python - 如何查找落在每一行的时间段内的行数,同时满足其他列中的条件?

python - 将 pandas 数据帧值转换为标量

apache-spark - 使用 map 创建新列

python - 根据另一列的值替换 pandas DataFrame 中的值

python - 将稀疏矩阵从 Python 传输到 R

Python OpenCV - 删除标题栏、工具栏和状态栏

python - 如何处理未作为异常引发的 SQLITE 错误,例如 "has no column named"?

pandas:从现有列值创建新数据框