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的固定内存的行为(更不用提迭代两次)。
添加回答
举报