python - 根据 Pandas 中特定键的出现将长序列转换为数据框

标签 python pandas dataframe

首先,如果问题主题看起来含糊不清,我们深表歉意。我会尽量说清楚。 我有一个像这样的 Pandas 系列:

A
a1
b1
c1
B
a2
b2
c2

我们需要形成一个数据框,其中 {A,B} 是第一列的值,每个后面的值是第二列的值。对于我们的示例,类似于:

A    a1
A    b1
A    c1
B    a2
B    b2
B    c2

我们在列表 [A,B,...] 中包含所有第一列标签。

我尝试 df.apply 一些功能,在我看来这似乎一点也不可怕,更像是机器级代码。有人有想法吗?

最佳答案

这是一种替代方法,它依赖于标签列表中的成员资格,而不是字符串解析:

In [78]: labels = ["A", "B"]

In [79]: marks = s.isin(labels)

In [80]: pd.concat([s.where(marks).ffill(), s], axis=1).loc[~marks]
Out[80]: 
   0   1
1  A  a1
2  A  b1
3  A  c1
5  B  a2
6  B  b2
7  B  c2

一步一步,首先我们构建marks,这是一个 bool 系列,告诉我们每个新部分从哪里开始:

In [22]: marks = s.isin(labels)

In [23]: marks
Out[23]: 
0     True
1    False
2    False
3    False
4     True
5    False
6    False
7    False
dtype: bool

最初我打算使用 marks.cumsum() 进行分组,但在这里使用 where 更简单。

然后我们可以使用 s.where(marks).ffill() 获得包含适当标签的系列:

In [24]: s.where(marks)
Out[24]: 
0      A
1    NaN
2    NaN
3    NaN
4      B
5    NaN
6    NaN
7    NaN
dtype: object

In [25]: s.where(marks).ffill()
Out[25]: 
0    A
1    A
2    A
3    A
4    B
5    B
6    B
7    B
dtype: object

之后,我们只是连接:

In [26]: pd.concat([s.where(marks).ffill(), s], axis=1)
Out[26]: 
   0   1
0  A   A
1  A  a1
2  A  b1
3  A  c1
4  B   B
5  B  a2
6  B  b2
7  B  c2

并使用 .loc[~marks] 保留标记新部分开始的行:

In [27]: pd.concat([s.where(marks).ffill(), s], axis=1).loc[~marks]
Out[27]: 
   0   1
1  A  a1
2  A  b1
3  A  c1
5  B  a2
6  B  b2
7  B  c2

关于python - 根据 Pandas 中特定键的出现将长序列转换为数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46802239/

相关文章:

python - 如何在Keras中使用reset_states(states)函数?

Python selenium : selenium. common.exceptions.NoSuchWindowException:消息:浏览上下文已被丢弃

python - pandas:选择行 - 基于列表 - 具有重复行标签的 DF

python - 将 pandas 系列转换为列表系列或将 numpy 数组转换为列表数组

python - 如何将 pandas 数据框中的数字列与 NaN 结合起来?

r - 按组从前一行减去值

Python TCP 套接字数据有时会丢失部分。套接字溢出?

python - 如何对 pandas 数据框地理定位进行切片

r - 将列添加到 R 中的空数据框中

python - 使用 Python 的 Eclipse - 难以选择 python 版本来创建 egg 文件