Python 如何分解列值而不复制panda dataframe中的其他列值?

Python 如何分解列值而不复制panda dataframe中的其他列值?,python,pandas,Python,Pandas,我有这样的想法: id ColumnA ColumnB ColumnC 1 Audi_BMW_VW BMW_Audi VW 2 VW Audi Audi_BMW_VW 我想根据出现时的分解来分解列。比如像这样的“A列” df['Column A'].str.split('_')).explode('Column A')

我有这样的想法:

id       ColumnA           ColumnB           ColumnC
1        Audi_BMW_VW       BMW_Audi             VW
2          VW                 Audi            Audi_BMW_VW
我想根据出现时的分解来分解列。比如像这样的“A列”

df['Column A'].str.split('_')).explode('Column A')
但当我对B列使用类似的查询时,它会重复A列的值,但我真的希望只有ID应该重复所需的输出如下:

id       ColumnA           ColumnB           ColumnC
1        Audi                BMW             VW
1         BMW                Audi
1         VW                  
2         VW                 Audi            Audi
2                                            BMW
2                                            VW

大量的整形。关键点是将
id
作为索引的单个序列堆叠起来,然后调用
Series.str.split

(df.set_index('id')             # keep 'id' bound to cells in the row 
   .stack()                     # to a single Series
   .str.split('_', expand=True) # split into separate cells on '_'
   .unstack(-1).stack(0)        # original column labels back to columns
   .reset_index(-1, drop=True)  # remove split number label
)

zip\u最长
与最近的
爆炸式回答非常相似

from itertools import zip_longest

data = [
    (i, *tup)
    for i, *other in df.itertuples(index=False)
    for tup in zip_longest(*[x.split('_') for x in other])
]

pd.DataFrame(data, columns=df.columns)

   id ColumnA ColumnB ColumnC
0   1    Audi     BMW      VW
1   1     BMW    Audi    None
2   1      VW    None    None
3   2      VW    Audi    Audi
4   2    None    None     BMW
5   2    None    None      VW

IIUC在
str.split
之后使用
melt
join
,我不会更改列名,因为此处的名称与原始df无关

s=df.melt('id')
s=s.join(s.value.str.split('_',expand=True))
s
Out[265]: 
   id variable        value     0     1     2
0   1  ColumnA  Audi_BMW_VW  Audi   BMW    VW
1   2  ColumnA           VW    VW  None  None
2   1  ColumnB     BMW_Audi   BMW  Audi  None
3   2  ColumnB         Audi  Audi  None  None
4   1  ColumnC           VW    VW  None  None
5   2  ColumnC  Audi_BMW_VW  Audi   BMW    VW

谢谢有没有可能不获取双索引?@s_khan92如果删除最后一行
。重置索引(-1,drop=True)
您将拥有一个可能有用的多索引。否则,您只需在另一个
.reset_index()
上进行tac,它将
'id'
移动到列中,并为您提供默认的RangeIndexHanks。我以前从未用过这个。但是当我尝试您的查询时,我得到了
AttributeError:“float”对象没有属性“str”
我甚至更改了
x.str
,但仍然是相同的错误我猜测一些初始值是
np.nan
。尝试将
df.itertuples
替换为
df.fillna('').itertuples
s=df.melt('id')
s=s.join(s.value.str.split('_',expand=True))
s
Out[265]: 
   id variable        value     0     1     2
0   1  ColumnA  Audi_BMW_VW  Audi   BMW    VW
1   2  ColumnA           VW    VW  None  None
2   1  ColumnB     BMW_Audi   BMW  Audi  None
3   2  ColumnB         Audi  Audi  None  None
4   1  ColumnC           VW    VW  None  None
5   2  ColumnC  Audi_BMW_VW  Audi   BMW    VW