假设我有一个这样的DatFrame:

col1 col2
1 3
2 4

我想对它应用一个函数,以便复制每一行并添加一个新列.对于为偶数值COL1创建的重复行,新列中的值是‘a’和‘b’,对于奇数值COL1,新列中的值是‘c’和‘d’.

因此,所需的输出为:

col1 col2 col3
1 3 c
1 3 d
2 4 a
2 4 b

我试图通过迭代所有行来简单地解决这个问题,并得到了我想要的结果, 但据我所知,如果我们有数十万行,iterrows()行是非常慢的.

import pandas as pd
import numpy as np

d = {'col1': [1, 2], 'col2': [3, 4]}
df = pd.DataFrame(data=d)


def add_rows(row):
    """
    This function is used in apply function. It adds a new column and adds rows to the dataframe.
    :param row:
    :return:
    """
    col3 = np.array(['a', 'b'])
    out_df = pd.DataFrame([row.tolist()], columns=row.index)
    out_df['col3'] = None
    if row['col1'] % 2 == 0:
        out_df.at[0, 'col3'] = col3
    else:
        out_df.at[0, 'col3'] = np.array(['c', 'd'])
    out = out_df.explode('col3', ignore_index=True)
    return out

cols = list(df.columns)
cols.append('col3')
result = pd.DataFrame(columns=cols)
for index, row in df.iterrows():
    rows = add_rows(row)
    result = pd.concat([result, rows])
result.reset_index(drop=True, inplace=True)
print(result)

我的数据有几十万行和几千列. 这能以更好的方式实现吗? 我曾try 对此函数执行apply次,但得到了一些奇怪的输出. 也许Apply需要返回一些不同于数据框的内容才能正常工作?

推荐答案

您可以使用.apply来判断col1中的值是偶数还是奇数,然后分配所需的列表,然后使用.explode:

df["col3"] = df.apply(lambda x: ["c", "d"] if x["col1"] % 2 else ["a", "b"], axis=1)
df = df.explode("col3")

print(df)

打印:

   col1  col2 col3
0     1     3    c
0     1     3    d
1     2     4    a
1     2     4    b

Python相关问答推荐

为什么Pydantic在我申报邮箱时说邮箱丢失

如何从. text中进行pip安装跳过无法访问的库

有什么方法可以修复奇怪的y轴Python matplotlib图吗?

使用Python Great Expectations和python-oracledb

删除pandas rame时间序列列中未更改的值

Python:记录而不是在文件中写入询问在多文件项目中记录的最佳实践

遵循轮廓中对象方向的计算线

Polars:使用列值引用when / then表达中的其他列

无法使用equals_html从网址获取全文

通过优化空间在Python中的饼图中添加标签

Polars比较了两个预设-有没有方法在第一次不匹配时立即失败

如果条件为真,则Groupby.mean()

连接两个具有不同标题的收件箱

如何访问所有文件,例如环境变量

如何在Python中并行化以下搜索?

Django REST Framework:无法正确地将值注释到多对多模型,不断得到错误字段名称字段对模型无效'<><>

当递归函数的返回值未绑定到变量时,非局部变量不更新:

提取相关行的最快方法—pandas

如何在TensorFlow中分类多个类

为什么'if x is None:pass'比'x is None'单独使用更快?