1 回答

TA貢獻1877條經(jīng)驗 獲得超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
如果您不想修改原始數(shù)據(jù)框,也可以使用.assignwhich返回一個新的數(shù)據(jù)框:
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對象,它創(chuàng)建了一個完整列表,而不是充分利用range的固定內(nèi)存的行為(更不用提迭代兩次)。
添加回答
舉報