将系列转换为具有特定维度的数据框

时间:2017-11-07 09:50:51

标签: python pandas dataframe series

我有一个5值的系列

[Serializable]
public class Document
{

    [DataMember]
    [XmlIgnore]
    public string FileURL { get; set; }

    [DataMember]
    [XmlIgnore]
    public string FileSize { get; set; }       

}

我有一个包含n列的数据框A.

有没有办法让数据框的维度为(5 * n)。所有列都由系列组成,列名与数据框A?

相同

例如:

数据框A看起来像

<a:_x003C_DocumentDetails_x003E_k__BackingField>
  <a:Document>                  
    <a:_x003C_FileType_x003E_k__BackingField>PDF</a:_x003C_FileType_x003E_k__BackingField>
    <a:_x003C_FileURL_x003E_k__BackingField>C:/log/Test.pdf</a:_x003C_FileURL_x003E_k__BackingField>                    
  </a:Document>
</a:_x003C_DocumentDetails_x003E_k__BackingField>

并且新数据框看起来像

    0 A
    1 A
    2 B
    3 C
    4 E

我现在提出的最佳解决方案是制作A副本并使用循环逐列更改新数据帧的值。

感谢您提供任何帮助!

2 个答案:

答案 0 :(得分:2)

使用concat

df = pd.concat([s] * len(df.columns), 1, keys=df.columns)
print (df)
  col1 col2
0    A    A
1    A    A
2    B    B
3    C    C
4    E    E

如果需要更快的解决方案,请使用numpy.repeat + numpy.reshape

l = len(df.columns)
df = pd.DataFrame(np.repeat(s,l ).reshape(-1,l), columns=df.columns, index=df.index)
print (df)
  col1 col2
0    A    A
1    A    A
2    B    B
3    C    C
4    E    E

或更简单:

l = len(df.columns)
df = pd.DataFrame(np.column_stack([s] * l), columns=df.columns, index=df.index)
print (df)
  col1 col2
0    A    A
1    A    A
2    B    B
3    C    C
4    E    E

<强>计时

np.random.seed(123)

L = list('abcdefghijklmno') 
s = pd.Series(np.random.choice(L, 100))

df = pd.DataFrame(np.random.randint(100, size=(100, 100))).add_prefix('col')

print (df)

In [161]: %timeit pd.concat([s] * len(df.columns), 1, keys=df.columns)
100 loops, best of 3: 2.84 ms per loop

In [162]: %timeit pd.DataFrame(np.repeat(s.values,len(df.columns)).reshape(-1,len(df.columns)), columns=df.columns, index=df.index)
1000 loops, best of 3: 199 µs per loop

In [163]: %timeit pd.DataFrame(np.column_stack([s] * len(df.columns)), columns=df.columns, index=df.index)
1000 loops, best of 3: 1 ms per loop

In [164]: %timeit pd.DataFrame({k : s for k in df.columns})
100 loops, best of 3: 2.33 ms per loop

答案 1 :(得分:1)

带有 dict comp。

DataFrame构造函数

pd.DataFrame({k : df1.Col for k in df2.columns})

  col1 col2
0    A    A
1    A    A
2    B    B
3    C    C
4    E    E
相关问题