首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据条件在Pandas dataframe中创建重复行,并更改特定列的值

根据条件在Pandas dataframe中创建重复行,并更改特定列的值
EN

Stack Overflow用户
提问于 2021-11-23 13:31:05
回答 2查看 2.5K关注 0票数 0

我有一个有多个列的Pandas dataframe (假设以下列格式简化示例):

代码语言:javascript
运行
复制
Item        Interval    Specs
Chocolate      0        0.001
Chocolate      3        0.002
Chocolate      5        0.007
Milk           0        0.004
Milk           2        0.008
....

我想要做的是为dataframe中的每个原始行创建重复行,其中,Interval值是0,对于其他Interval情况,Interval的值被更改了。例如,Item巧克力在原始数据中有3例与Interval 0, 3 and 5有关。对于Interval为0的情况,我希望复制此行并保持Specs值不变,但只修改Interval值并创建2个重复副本,即Interval值3和5。类似地,对于Milk Item,我希望创建一个重复行,间隔改为2。(因此,要创建的重复行数直接取决于单个Item的唯一Interval值的数量)。

预期的数据格式是:

代码语言:javascript
运行
复制
Item        Interval    Specs
Chocolate      0        0.001
Chocolate      3        0.002
Chocolate      5        0.007
Chocolate      3        0.001   --Duplicate row added and Interval value changed
Chocolate      5        0.001   --Duplicate row added and Interval value changed
Milk           0        0.004 
Milk           2        0.008   
Milk           2        0.004   --Duplicate row added and Interval value changed

因此,类似的问题(Duplicate rows based on value with condition)侧重于基于条件创建重复行,而不是更改与其他行对应的数据格式中的值。如能就如何做到这一点提出任何建议,将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-23 15:02:34

解决这一问题的一种方法是使用所有没有Interval=0的元素创建第二个数据格式。

代码语言:javascript
运行
复制
df2 = df[df.Interval != 0]

然后将列Specs的值从带有Interval==0的条目映射到新数据from中的Specs列:

代码语言:javascript
运行
复制
df2.loc[:, 'Specs'] = df2['Item'].map(df[df.Interval == 0].set_index('Item')['Specs'])

并将两个数据文件串连在一起。

代码语言:javascript
运行
复制
df = pd.concat([df, df2], axis=0)

这将为您提供所需的输出。

票数 1
EN

Stack Overflow用户

发布于 2021-11-23 15:03:47

我们可以通过首先创建2个dataframes来做到这一点:

  1. DF,行的间隔为0
  2. DF,行的间隔为0

然后,我们可以创建一个数据字典,它的间隔为0。使用此字典,我们可以更新其他数据格式的规范值。然后,更新的dataframe与原始dataframe合并。代码如下-

代码语言:javascript
运行
复制
rows = [['Chocolate', 0, 0.001],
    ['Chocolate', 3, 0.002],
    ['Chocolate', 5, 0.007],
    ['Milk', 0, 0.004],
    ['Milk', 2, 0.008]]

df = pd.DataFrame(rows, columns=['Item', 'Interval', 'Specs']) # original dataframe

df1 = df[df['Interval'].ne(0)].copy() # dataframe with rows having interval other than 0
df2 = df[df['Interval'].eq(0)].copy() # dataframe with rows having interval 0

di = pd.Series(df2['Specs'].values, index=df2['Item']).to_dict()

for key, val in di.items():
    df1.loc[df1.Item == key, 'Specs'] = val

res = pd.concat([df, df1], ignore_index=True).sort_values('Item')
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70081807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档