【问题标题】:Python Pandas Data frame creationPython Pandas 数据框创建
【发布时间】:2018-03-15 16:57:31
【问题描述】:

我尝试使用以下代码创建数据框 df:

import numpy as np
import pandas as pd
index = [0,1,2,3,4,5]
s = pd.Series([1,2,3,4,5,6],index= index)
t = pd.Series([2,4,6,8,10,12],index= index)
df = pd.DataFrame(s,columns = ["MUL1"])
df["MUL2"] =t

print df


   MUL1  MUL2
0     1     2
1     2     4
2     3     6
3     4     8
4     5    10
5     6    12

在尝试使用以下语法创建相同的数据框时,我得到了一个奇怪的输出。

df = pd.DataFrame([s,t],columns = ["MUL1","MUL2"])

print df

   MUL1  MUL2
0   NaN   NaN
1   NaN   NaN

请解释为什么当两个系列都非空时 NaN 会显示在数据框中,以及为什么只显示两行而没有其他行。

还通过使用 pandas DataFrame 方法中的 columns 参数,提供创建数据框的正确方法,就像上面提到的一样。

【问题讨论】:

    标签: python-2.7 pandas numpy dataframe


    【解决方案1】:

    正确的方法之一是将输入列表中的数组数据堆叠成列 -

    In [161]: pd.DataFrame(np.c_[s,t],columns = ["MUL1","MUL2"])
    Out[161]: 
       MUL1  MUL2
    0     1     2
    1     2     4
    2     3     6
    3     4     8
    4     5    10
    5     6    12
    

    在幕后,堆叠创建了一个二维数组,然后将其转换为数据帧。这是堆叠数组的样子 -

    In [162]: np.c_[s,t]
    Out[162]: 
    array([[ 1,  2],
           [ 2,  4],
           [ 3,  6],
           [ 4,  8],
           [ 5, 10],
           [ 6, 12]])
    

    【讨论】:

    • 非常感谢您的回答先生。但我有一个小问题。使用的系列 s 和 t 是可以通过打印其中之一来确定的列,例如打印 0 1 1 2 2 3 3 4 4 5 5 6 数据类型:int64。那么为什么我们必须明确使用 np.c_ 将它们转换为列?
    • @SarvagyaDubey st 是 pandas 系列,很可能它们的索引在使用 [s,t] 创建数据框时会搞砸。通过堆叠,它为我们提供了数组数据,因为我们正在摆脱这些索引。这有助于我们获得与其先前索引信息无关的所需数据框。
    • 嗯。我认为如果输入是系列不是很好的方法转换为 numpy 数组,因为丢失了index 信息。特别是如果每​​个系列都有不同的索引,您的解决方案就会失败。你怎么看?
    • 您的解决方案仅在默认索引或与pd.DataFrame(np.c_[s,t],columns = ["MUL1","MUL2"], index=s.index)相同的情况下才有效
    • @jezrael 我认为 OP 希望从 st 获取与索引信息无关的数据以创建输出数据帧。如果他们需要处理这种情况/预期输出的情况,我会让 OP 澄清一下。
    【解决方案2】:

    如果删除列参数得到:

    df = pd.DataFrame([s,t])
    
    print (df)
       0  1  2  3   4   5
    0  1  2  3  4   5   6
    1  2  4  6  8  10  12
    

    然后定义列 - 如果列不存在,则获取 NaNs 列:

    df = pd.DataFrame([s,t], columns=[0,'MUL2'])
    
    print (df)
         0  MUL2
    0  1.0   NaN
    1  2.0   NaN
    

    最好使用dictionary:

    df = pd.DataFrame({'MUL1':s,'MUL2':t})
    
    print (df)
       MUL1  MUL2
    0     1     2
    1     2     4
    2     3     6
    3     4     8
    4     5    10
    5     6    12
    

    如果需要更改列顺序添加列参数:

    df = pd.DataFrame({'MUL1':s,'MUL2':t}, columns=['MUL2','MUL1'])
    
    print (df)
       MUL2  MUL1
    0     2     1
    1     4     2
    2     6     3
    3     8     4
    4    10     5
    5    12     6
    

    更多信息在dataframe documentation

    不需要concat - DataFrame 构造函数的另一个解决方案:

    df = pd.concat([s,t], axis=1, keys=['MUL1','MUL2'])
    
    print (df)
       MUL1  MUL2
    0     1     2
    1     2     4
    2     3     6
    3     4     8
    4     5    10
    5     6    12
    

    【讨论】:

    • 我打算在不使用字典的情况下创建数据框。
    • 我添加了另一个解决方案 - 不需要 DataFrame 构造函数。
    • 非常感谢您的帮助
    • @jezrael 谢谢伙计,你是个救命稻草,有这么多有用的答案:)
    【解决方案3】:

    pandas.DataFrame 接受参数 data,其类型可以是 ndarray、iterable、dict 或 dataframe。
    如果您传入一个列表,它将假定每个成员都是一行。示例:

    a = [1,2,3]
    b = [2,4,6]
    
    df = pd.DataFrame([a, b], columns = ["Col1","Col2", "Col3"])
    
    # output 1:
       Col1  Col2  Col3
    0     1     2     3
    1     2     4     6
    

    你得到NaN,因为它期望index = [0,1],但你给[0,1,2,3,4,5]
    要得到你想要的形状,先转置数据:

    data = np.array([a, b]).transpose()
    

    如何创建 pandas 数据框

    import pandas as pd
    
    a = [1,2,3]
    b = [2,4,6]
    
    df = pd.DataFrame(dict(Col1=a, Col2=b))  
    

    输出:

       Col1  Col2
    0     1     2
    1     2     4
    2     3     6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 2021-12-02
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      相关资源
      最近更新 更多