假设您想使用列名作为删除每一列的指示符。在这里,我提供选项:
from time import time
import numpy as np
import pandas as pd
d = pd.DataFrame(np.random.randint(0, 10, (10000, 7)), columns=['a', 'b', 'c', 'd', 'e', 'f', 'g'])
print(d.shape)
t0 = time()
d.apply(lambda row: pd.Series([row[col_name] for col_name in row.index if col_name == 'a'],
index=[col_name for col_name in row.index if col_name == 'a']), axis=1, result_type="expand")
print(time() - t0)
t0 = time()
d.apply(lambda column: len(column)*[np.nan] if column.name == 'a' else column, axis=0).dropna(how='all', axis=1)
print(time() - t0)
(10000, 7)
5.570859670639038
0.005705833435058594
由于该列可用于提取您喜欢的任何条件,您可以相应地调整条件。
虽然第一个解决方案不那么老套,但它会遍历每一行,因此速度非常慢。第二个版本非常快,虽然有点 hacky:您需要确定,没有其他列只有 np.nan 值。
也许其他人有一个快速但仍然不是黑客的解决方案。