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

给定一个数据框,如下所示:


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

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

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

                index=[0, 1, 2])


   A   B   C

0  A0  B0  C0

1  A1  B1  C1

2  A2  B2  C2 

我想添加一个用值 False 初始化的列“D”。列“D”将用于数据帧的未来处理:


    A   B   C      D

0  A0  B0  C0  False

1  A1  B1  C1  False

2  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”文件?在处理非常大的文件中的数据时,它当然看起来不太好。


慕斯王
浏览 146回答 1
1回答

冉冉说

您可以只使用基于索引的分配:In [16]: df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2'],    ...:                 'B': ['B0', 'B1', 'B2'],    ...:                 'C': ['C0', 'C1', 'C2']},    ...:                 index=[0, 1, 2])In [17]: df1Out[17]:    A   B   C0  A0  B0  C01  A1  B1  C12  A2  B2  C2In [18]: df1['D'] = FalseIn [19]: df1Out[19]:    A   B   C      D0  A0  B0  C0  False1  A1  B1  C1  False2  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]: df1Out[21]:    A   B   C0  A0  B0  C01  A1  B1  C12  A2  B2  C2In [22]: df1.assign(D=False)Out[22]:    A   B   C      D0  A0  B0  C0  False1  A1  B1  C1  False2  A2  B2  C2  FalseIn [23]: df1Out[23]:    A   B   C0  A0  B0  C01  A1  B1  C12  A2  B2  C2pd.concat在这里使用真的没有用,您可以简单地分配列表!无论哪种方式,它仍然要慢得多:In [44]: import timeitIn [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.6879564090049826In [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的固定内存的行为(更不用提迭代两次)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python