我有一个具有多个NAN值的数据帧.我想用它构建三个不同的数据帧.以下是我的df的一个示例:

df = pd.DataFrame({'a':[10, np.nan, np.nan, 22, np.nan], 'b':[23, 12, 7, 4, np.nan],  'c':[13, np.nan, np.nan, np.nan, 65]})

     a      b   c
0   10.0.  23.0 13.0
1   NaN    12.0 NaN
2   NaN    7.0  NaN
3   22.0.  4.0  NaN
4   NaN    NaN  65.0

我想根据以下内容为df分配一个id: 从一个不是NAN的小区到下一个小区,它们的ID是相等的.例如,在此df中,我们只有2个ID(1,2).从第0行到第2行的id=1,其他行的id=2. 因此,在此基础上,我想构建以下df.

ID和a栏:

    id  a
0   1   1
1   2   22

ID和b栏:

    id  b
0   1   23
1   1   12
2   1   7
3   2   4

ID和c栏:

    id  c
0   1   13
1   2   65

你能帮我拿一下吗?谢谢

推荐答案

您可以基于非NaN值a生成id,然后通过删除在其各自的列中具有NaN个值的行来创建输出:

df['id'] = df['a'].notna().cumsum()
df_a = df[['id','a']].dropna()
df_b = df[['id','b']].dropna()
df_c = df[['id','c']].dropna()

输出:

>>> df_a
   id     a
0   1  10.0
3   2  22.0
>>> df_b
   id     b
0   1  23.0
1   1  12.0
2   1   7.0
3   2   4.0
>>> df_c
   id     c
0   1  13.0
4   2  65.0

如果需要,您可以在结果上设置reset_index,以使索引从0开始连续.

df_a = df[['id','a']].dropna().reset_index(drop=True)

输出:

   id     a
0   1  10.0
1   2  22.0

Python相关问答推荐

如何确保Flask应用程序管理面板中的项目具有单击删除功能?

如何分割我的收件箱,以便连续的数字各自位于自己的收件箱中?

将大小为n*512的数组绘制到另一个大小为n*256的数组的PC组件

为什么使用SciPy中的Distance. cos函数比直接执行其Python代码更快?

将嵌套列表的字典转换为数据框中的行

如何在Python中按组应用简单的线性回归?

Plotly:如何更改Heatmap中彩色条的勾选文本

这家einsum运营在做什么?E = NP.einsum(aj,kl-il,A,B)

如何将Matplotlib的fig.add_axes本地坐标与我的坐标关联起来?

添加包含中具有任何值的其他列的计数的列

如何在BeautifulSoup中链接Find()方法并处理无?

DataFrame groupby函数从列返回数组而不是值

使用新的类型语法正确注释ParamSecdecorator (3.12)

Pytest两个具有无限循环和await命令的Deliverc函数

pandas滚动和窗口中有效观察的最大数量

计算组中唯一值的数量

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

解决调用嵌入式函数的XSLT中表达式的语法移位/归约冲突

如何获取Python synsets列表的第一个内容?

如何在海上配对图中使某些标记周围的黑色边框