为了账号安全,请及时绑定邮箱和手机立即绑定

将列附加到填充相同布尔值的数据帧的最佳方法是什么

将列附加到填充相同布尔值的数据帧的最佳方法是什么

慕斯王 2021-06-26 07:24:57
给定一个数据框,如下所示:df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],                'B': ['B0', 'B1', 'B2'],                'C': ['C0', 'C1', 'C2']},                index=[0, 1, 2])   A   B   C0  A0  B0  C01  A1  B1  C12  A2  B2  C2 我想添加一个用值 False 初始化的列“D”。列“D”将用于数据帧的未来处理:    A   B   C      D0  A0  B0  C0  False1  A1  B1  C1  False2  A2  B2  C2  False我根据 df1 索引生成了一个 False 值列表,并用它来创建一个 df2,然后将它与 df1 连接起来:Dlist = [False for item in list(range(len(df1.index)))]d = {'D':Dlist}df2 = pd.DataFrame(d, index = df1.index)result = pd.concat([df1, df2], axis=1, join_axes=[df1.index])几个问题:第一行中的列表理解需要如此参与吗?我尝试了以下操作,认为 'df1.index' 就像列表一样。它没有用。Dlist = [False for item in df1.index]更广泛地说,有没有更好的方法来使用数据框操作来做到这一点?如果我正在处理一个包含 df1 数据的“csv”文件,我可以在生成数据帧之前轻松地将“D”添加到文件中。在哲学方面,在处理数据时是否不可避免地修改数据帧或它们来自的“csv”文件?在处理非常大的文件中的数据时,它当然看起来不太好。
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

您可以只使用基于索引的分配:


In [16]: df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],

    ...:                 'B': ['B0', 'B1', 'B2'],

    ...:                 'C': ['C0', 'C1', 'C2']},

    ...:                 index=[0, 1, 2])


In [17]: df1

Out[17]:

    A   B   C

0  A0  B0  C0

1  A1  B1  C1

2  A2  B2  C2


In [18]: df1['D'] = False


In [19]: df1

Out[19]:

    A   B   C      D

0  A0  B0  C0  False

1  A1  B1  C1  False

2  A2  B2  C2  False

如果您不想修改原始数据框,也可以使用.assignwhich返回一个新的数据框:


In [20]: df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],

    ...:                 'B': ['B0', 'B1', 'B2'],

    ...:                 'C': ['C0', 'C1', 'C2']},

    ...:                 index=[0, 1, 2])


In [21]: df1

Out[21]:

    A   B   C

0  A0  B0  C0

1  A1  B1  C1

2  A2  B2  C2


In [22]: df1.assign(D=False)

Out[22]:

    A   B   C      D

0  A0  B0  C0  False

1  A1  B1  C1  False

2  A2  B2  C2  False


In [23]: df1

Out[23]:

    A   B   C

0  A0  B0  C0

1  A1  B1  C1

2  A2  B2  C2

pd.concat在这里使用真的没有用,您可以简单地分配列表!无论哪种方式,它仍然要慢得多:


In [44]: import timeit


In [45]: setup = 'import pandas as pd; df = pd.DataFrame({"a":list(range(100000))})'


In [46]: lstcomp = "df['D'] = [False for item in range(len(df.index))]"


In [47]: assgnmt = "df['D'] = False"


In [48]: timeit.timeit(lstcomp, setup, number=100)

Out[48]: 0.6879564090049826


In [49]: timeit.timeit(assgnmt, setup, number=100)

Out[49]: 0.008814844011794776

至于你的列表理解,没有必要,但它绝对过于复杂。您说您尝试迭代索引,但“它不起作用”,但您从未解释过它是如何不起作用的。这个对我有用:


In [24]: [False for item in list(range(len(df1.index)))]

Out[24]: [False, False, False]


In [25]: [False for item in df1.index]

Out[25]: [False, False, False]

请注意,您的倍加低效的,因为它要求list的上range对象,它创建了一个完整列表,而不是充分利用range的固定内存的行为(更不用提迭代两次)。


查看完整回答
反对 回复 2021-06-29
  • 1 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信