python - 如何根据其他列向熊猫数据框添加新行?
问题描述
假设,我有以下数据框作为示例。
name age status price
0 frank 12 1 100
1 jack 33 0 190
2 joe 22 1 200
******************************
期望的输出:
name age status price
0 frank 12 1 100
1 jack 33 0 190
2 jack NaN 0 -190
3 joe 22 1 200
******************************
我还在下面发布了示例数据框,因此您可以轻松测试它。
df1 = pd.DataFrame({
"name":["frank", "jack", "joe"],
"age": [12, 33, 22],
"status": [1,0, 1],
"price": [100,190, 200]
})
如您所见,我想在上面的行的基础上插入一个新行,即status
0,这意味着事务失败。为了更轻松地进行统计,我想在该行下方生成一个新行。我也希望它price
是负数。并且由于我不关心新行的整列,所以我希望另一列是NaN
,就像我想要的输出中的“年龄”一样。
到目前为止我所尝试的。
import pandas as pd
import numpy as np
df1 = pd.DataFrame({
"name":["frank", "jack", "joe"],
"age": [12, 33, 22],
"status": [1,0, 1],
"price": [100,190, 200]
})
df2_list = []
for i, row in df1.iterrows():
if row["status"] == 0:
origin_row = row.to_dict()
new_row = ({
"name": origin_row.get("name"),
#"age": origin_row.get("age"),
"age": np.NaN,
"status": origin_row.get("status"),
"price": -origin_row.get("price"),
})
df2_list.append(new_row)
df2 = pd.DataFrame(df2_list)
# concat df1 and df2 and sort it .
df3 = pd.concat([df1, df2], ignore_index=True)
df4 = df3.sort_values(['name', 'price'], ascending=[True, False])
print(df4)
我有一个循环,并检查它是否符合我的条件status==0
,并将其附加到我的 tmp 列表中,并且......但是代码太多了。我想知道有什么好的方法吗,我的意思是更多的 Pythonic 代码或 pandas 已经有了一些功能可以吗?
解决方案
用于numpy.repeat
添加行和Series.duplicated
设置价格。
df2 = pd.DataFrame(df.values.repeat(df.status.eq(0)+1, axis=0), columns=df.columns)
df2.loc[df2.name.duplicated(), 'price'] *= -1
df2
name age status price
0 frank 12 1 100
1 jack 33 0 190
2 jack 33 0 -190
3 joe 22 1 200
如果您还需要在年龄列中屏蔽 NaN,则可以使用Series.mask
.
df2.age.mask(df2.name.duplicated())
0 12
1 33
2 NaN
3 22
Name: age, dtype: object
完整的代码。
df2 = pd.DataFrame(df.values.repeat(df.status.eq(0)+1, axis=0), columns=df.columns)
isdup = df2.name.duplicated()
df2.loc[isdup, 'price'] *= -1
df2['age'] = df2['age'].mask(isdup)
df2
name age status price
0 frank 12 1 100
1 jack 33 0 190
2 jack NaN 0 -190
3 joe 22 1 200
推荐阅读
- gimp - 如何从插件运行降噪过滤器?
- html - 如何在 Bootstrap 4 中更改屏幕宽度的同时更改导航栏的颜色
- javascript - html在 Angular 中添加的标签在 Edge 和 IE 中不显示“手”指针
- python-3.x - 调用另一个类中定义的方法
- excel - 如何在 excel 或 OpenOffice 中创建与第三个中的所有值匹配的两列?
- node.js - 第三方重定向到浏览器,而不是后端
- javascript - 当前以 HTML5 结尾时如何播放下一个音轨?
- iis - URL 重写到不同的虚拟目录而不更改 URL
- php - 如何验证PHP中是否存在一行?
- javascript - 使用递归的Javascript洪水填充算法