【发布时间】:2019-10-22 13:36:12
【问题描述】:
假设我有一个DataFrame:
>>> df = pd.DataFrame({'a1':[1,2],'a2':[3,4],'b1':[5,6],'b2':[7,8],'c':[9,0]})
>>> df
a1 a2 b1 b2 c
0 1 3 5 7 9
1 2 4 6 8 0
>>>
我想合并(可能不是合并,而是连接)名称的第一个字母相等的列,例如a1 和a2 等等......但正如我们所见,有一个@987654325 @ 列本身没有任何其他类似的列,因此我希望它们不要抛出错误,而是将NaNs 添加到它们。
我想以一种将宽 DataFrame 更改为长 DataFrame 的方式进行合并,基本上就像从宽到长的修改一样。
我已经有了解决问题的方法,但唯一的问题是它的效率非常低,我想要一个更高效、更快的解决方案(不像我的:P),我目前有一个for 循环和一个try except(呃,听起来已经很糟糕了)代码如:
>>> df2 = pd.DataFrame()
>>> for i in df.columns.str[:1].unique():
try:
df2[i] = df[[x for x in df.columns if x[:1] == i]].values.flatten()
except:
l = df[[x for x in df.columns if x[:1] == i]].values.flatten().tolist()
df2[i] = l + [pd.np.nan] * (len(df2) - len(l))
>>> df2
a b c
0 1 5 9.0
1 3 7 0.0
2 2 6 NaN
3 4 8 NaN
>>>
我想用更好的代码获得同样的结果。
【问题讨论】:
-
为什么c=0。与新数据帧中的 (a, b) = (3, 7) 对齐,而在原始数据帧中它们之间没有连接?
-
@GZ0 我的回答给出了准确的输出。
3,7水平第二,0垂直第二。 -
我知道。我只是质疑输出是否真的需要。在我看来,对齐 c=0 会更合理。与 (a, b) = (2, 6)
标签: python pandas dataframe merge