python - 如何根据其他列向 Pandas 数据框添加新行?

标签 python pandas

比方说,我有以下数据框作为示例。

    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,就像我想要的输出中的 'age' 一样。

到目前为止我尝试了什么。

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

关于python - 如何根据其他列向 Pandas 数据框添加新行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54917777/

相关文章:

python - 使用 boto3 连接到 S3 兼容存储

python - Python egg 文件有什么意义?

python - 确定数组 B 的每个元素在另一个数组 A 中的位置

python - matplotlib 中的自定义标记

python - 如何在 Microsoft Windows 中执行时立即停止 Python 关闭

python - 如何使用公共(public)键对来自三个不同数据帧的列求和

python - 绘制给定均值和西格玛的正态分布 - python

python - 将 Excel 读取到数据帧时出现解析器错误 Pandas

python - 列包含列 1

python - 如何处理 Pandas 中等于 "NA"的列?