将数据框转换为另一个数据框,将复合字符串单元格拆分为单独的行[重复]

Posted

技术标签:

【中文标题】将数据框转换为另一个数据框,将复合字符串单元格拆分为单独的行[重复]【英文标题】:Convert data frame to another data frame, split compound string cell into individual rows [duplicate] 【发布时间】:2019-01-15 23:33:32 【问题描述】:

我希望使用 Python 将数据框 df1 转换为 df2。我有一个使用循环的解决方案,但我想知道是否有更简单的方法来创建 df2。

df1

   Test1   Test2   2014  2015  2016  Present
1     x        a     90    85    84        0
2     x      a:b     88    79    72        1
3     y    a:b:c     75    76    81        0
4     y        b     60    62    66        0
5     y        c     68    62    66        1

df2

   Test1  Test2   2014  2015  2016  Present
1     x       a     90    85    84        0
2     x       a     88    79    72        1
3     x       b     88    79    72        1
4     y       a     75    76    81        0
5     y       b     75    76    81        0
6     y       c     75    76    81        0
7     y       b     60    62    66        0
8     y       c     68    62    66        1

【问题讨论】:

有趣的问题。但是,请选择 R 或 Python 来确定您想要这个问题的答案(例如:删除其中一个标签)。如果您想向另一个人要另一个人-那太好了。 (当它们合二为一时,其他人在以后发现这些技术时会很尴尬)。 (如果您包含当前的解决方案,这也有助于您选择的语言) tidyr检查separate_rows函数 谢谢。我将标签更改为 Python。 @arqchicago 它已重新打开,但如果您包含您不满意的现有解决方案,它仍然会有很大帮助。 【参考方案1】:

这是使用numpy.repeatitertools.chain 的一种方法:

import numpy as np
from itertools import chain

# split by delimiter and calculate length for each row
split = df['Test2'].str.split(':')
lens = split.map(len)

# repeat non-split columns
cols = ('Test1', '2014', '2015', '2016', 'Present')
d1 = col: np.repeat(df[col], lens) for col in cols

# chain split columns
d2 = 'Test2': list(chain.from_iterable(split))

# combine in a single dataframe
res = pd.DataFrame(**d1, **d2)

print(res)

   2014  2015  2016  Present Test1 Test2
1    90    85    84        0     x     a
2    88    79    72        1     x     a
2    88    79    72        1     x     b
3    75    76    81        0     y     a
3    75    76    81        0     y     b
3    75    76    81        0     y     c
4    60    62    66        0     y     b
5    68    62    66        1     y     c

【讨论】:

【参考方案2】:

这将实现你想要的:

# Converting "Test2" strings into lists of values
df["Test2"] = df["Test2"].apply(lambda x: x.split(":"))

# Creating second dataframe with "Test2" values
test2 = df.apply(lambda x: pd.Series(x['Test2']),axis=1).stack().reset_index(level=1, drop=True)
test2.name = 'Test2'

# Joining both dataframes
df = df.drop('Test2', axis=1).join(test2)

print(df)

  Test1 2014 2015 2016 Present Test2
1     x   90   85   84       0     a
2     x   88   79   72       1     a
2     x   88   79   72       1     b
3     y   75   76   81       0     a
3     y   75   76   81       0     b
3     y   75   76   81       0     c
4     y   60   62   66       0     b
5     y   68   62   66       1     c

类似问题(列已作为列表存在):12

【讨论】:

以上是关于将数据框转换为另一个数据框,将复合字符串单元格拆分为单独的行[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Pandas Dataframe 将我的字典变成了字符串

如何迭代数据列的每个单元格,转换和附加每个单元格?

将单元格中的字符串拆分为不同的行,pandas [关闭]

使熊猫数据框中的 H3 单元格转换更快

使用 DataBinding 将一个数据库文本拆分为 3 个文本框

Python,Pandas,数据框 - 拆分和删除单元格的某些部分