我有一个如下形式的数据框:

basket            fruit_apple   fruit_pear   fruit_cherry
basket_id_1       5             NaN          6
basket_id_2       NaN           1            NaN

我想创建两个新列,应该如下所示:

basket          fruit_type   number
basket_id_1     apple        5
basket_id_1     pear         NaN
basket_id_1     cherry       6
basket_id_2     apple        NaN
basket_id_2     pear         1
basket_id_2     cherry       NaN

其中 Fruit_type 的内容是用colname.split('_')[1]自动确定的,这如何以简洁的方式完成?

#1楼 票数:7 已采纳

我认为更快的是更改列名插入新列(因为值的数量较少),所以我建议在第一步使用rename并使用DataFrame.melt重塑,最后更改顺序由DataFrame.sort_values

df = (df.rename(columns= lambda x: x.split('_')[-1])
        .melt('basket', var_name='fruit_type', value_name='number')
        .sort_values('basket'))
print (df)
        basket fruit_type  number
0  basket_id_1      apple     5.0
2  basket_id_1       pear     NaN
4  basket_id_1     cherry     6.0
1  basket_id_2      apple     NaN
3  basket_id_2       pear     1.0
5  basket_id_2     cherry     NaN

另一个想法是将DataFrame.set_indexDataFrame.stack DataFrame.set_index使用:

df = (df.set_index('basket')
        .rename(columns= lambda x: x.split('_')[-1])
        .rename_axis('fruit_type', axis=1)
        .stack(dropna=False)
        .reset_index(name='number')
        )
print (df)
        basket fruit_type  number
0  basket_id_1      apple     5.0
1  basket_id_1       pear     NaN
2  basket_id_1     cherry     6.0
3  basket_id_2      apple     NaN
4  basket_id_2       pear     1.0
5  basket_id_2     cherry     NaN

#2楼 票数:2

从宽格式转换为长格式,
通过从fruit_type 列中删除“fruit_”来创建新列
并按“篮子”列排序

编辑:感谢@jezrael,他指出了剥离的危险(它会去掉任何字母,这肯定会影响其他用例的可扩展性),将其更改为替换,这应该更安全,因为它适用于正则表达式和分组。

(df.melt(id_vars='basket',
         var_name='fruit_type',
         value_name='number')
   .assign(fruit_type=lambda x: x.fruit_type.str.replace(r'fruit_',''))
   .sort_values('basket')
  )

    basket  fruit_type  number
0   basket_id_1 apple   5.0
2   basket_id_1 pear    NaN
4   basket_id_1 cherry  6.0
1   basket_id_2 apple   NaN
3   basket_id_2 pear    1.0
5   basket_id_2 cherry  NaN

  ask by LizzAlice translate from so

未解决问题?本站智能推荐:

1回复

如何使用pandas创建新的df列以使用正则表达式获取列名和值?

我有这样的列: 在熊猫df内。 请注意,不应忘记同一行中的其他列 - 它们彼此相关。 我想创建一个更多的df列来获得以下结果: 其中不存在的值只是空白或''。 我尝试过使用: 但它给出了类似于groupby结构的东西,并且取消堆叠它不会根据字符给出列名。 编辑:根据彼得的
2回复

用Pandas遍历df以创建新列

我目前正在第一次尝试遍历一组列(在 df 内),目的是创建两个新列: 1). 总计迭代到 2 的列中 1 的数量。第二列如果任何迭代列中有 1,则将 1 放入新列并中断。 ***我解决了这个问题*** 添加了我的 DF 上下文: 在合计 1 时,我还应该提到我只对 13 列中的 7 列感兴趣。
1回复

如果df一列中的值包含在df中两个相同的列名中,则创建新的df

几天前我在这里,我将尝试更好地重述我的问题。 我正在使用Python和Pandas并尝试完成某些任务。 我正在使用两个数据框,它们都具有学生ID。 如果第2列包含第一列中的学生ID,我希望能够将一个新的数据框合并在一起。 有人知道怎么做这个吗? 我尝试研究并使用pd.melt(),pd
1回复

根据df1中的列值查找df2中的相交值,并使用df1中检索到的值创建一个新列(不匹配的列名)

Python 新手,这是我需要帮助的最新挑战在 df1 中,我有以下数据分布: 在 df2 中,我有以下数据分布: 我想要实现的是在 df1 中添加一个名为“values”的列,其中包含一个来自 df2 的值,其中满足以下两个匹配条件(换句话说,它们相交的地方,这就是我需要的值) df1['D
1回复

Python:如何根据df中其他列的值在df中创建新列

我是编码的新手,所以这可能是一个完全的初学者错误,但是我使用python来分析一些数据。 我目前有一个与此相似的数据框: df = pd.DataFrame({'date' : ['2010-03-04', '2010-04-02', '2010-03-04','2010-04-02','2
1回复

如何创建新的pandas列,其中列表值==df索引但列表与原始数据帧的长度不同

我想在我的原始数据帧中添加一个新列,其中我的列表值 == 数据帧索引添加 1 else 0。但是,我的列表大小不同......我尝试了 for 循环,但它太慢了。并想用列表合成或矢量化(或任何其他快速的方式)来做。关于我如何做的任何想法我的数据: 列表 =[501,205,432,....] 我的代
3回复

Pandas:根据与另一列名称部分匹配的列值创建新列

我正在尝试在 Pandas 中创建一个新列。 我有一个现有的文本列,我希望这个新列包含另一列中包含的值,其中行值与列名部分匹配。 它类似于这个线程,但在我的情况下,我只会有一个部分匹配: Python:pandas:将行值与列名/键的值匹配我的桌子看起来像这样作为例子 我希望它看起来像: 第一行结
2回复

Pandas-根据列中的值创建列名

我想基于列中的值创建列名 这就是我所拥有的: 这是我想要的输出: