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

时间:2019-01-08 05:57:39

标签: python pandas dataframe

最后更新 最后更新2次

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

  

Pandas DataFrame列是拔出时的Pandas系列

但是,在我的情况下,这不是真的。

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

其他问题:如果数据列不是系列(如何使用tolist(),该如何从数据框列中获取列表?

更新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']],              标签= [[4、7、5、6、1、8、3、0、2]])

在打印df或写入.csv时,我没有看到labels,它只是一个普通的DataFrame。不确定我从哪里得到标签。

2 个答案:

答案 0 :(得分:4)

我认为您有重复的列名,因此,如果要选择Series可获得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'>

答案 1 :(得分:1)

pandas.core.frame.DataFrame的每个实例基本上都是一个数组,因此,如果调用此类型,则可以通过调用{{1来获取每一列(如果该列是一维的,将是pandas.core.series.Series类型) }}。

df.columns将为您提供一个可迭代的对象,您可以循环访问该对象以获取每一行的值。

您可能还想看看df.columns或其他类似的软件包,只是将pandas.read_json直接放入可能易于管理的pandas对象中