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