我有一个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副本并使用循环逐列更改新数据帧的值。
感谢您提供任何帮助!
答案 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)
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