我有一个包含大量列的pandas dataframe,我需要在不查看数据的情况下找到哪些列是二进制的(只有值0或1)。应该使用哪个函数?
5n0oy7gb1#
据我所知,没有直接的函数来测试这一点。相反,您需要根据数据的编码方式构建一些东西(例如1/0、T/F、真/假等)。此外,如果您的列有缺失值,则整个列将被编码为float而不是int。在下面的示例中,我测试所有唯一的非空值是否为“1”或“0”。它返回所有此类列的列表。
df = pd.DataFrame({'bool': [1, 0, 1, None], 'floats': [1.2, 3.1, 4.4, 5.5], 'ints': [1, 2, 3, 4], 'str': ['a', 'b', 'c', 'd']}) bool_cols = [col for col in df if df[[col]].dropna().unique().isin([0, 1]).all().values] # 2019-09-10 EDIT (per Hardik Gupta) bool_cols = [col for col in df if np.isin(df[col].dropna().unique(), [0, 1]).all()] >>> bool_cols ['bool'] >>> df[bool_cols] bool 0 1 1 0 2 1 3 NaN
zfciruhq2#
def is_binary(series, allow_na=False): if allow_na: series.dropna(inplace=True) return sorted(series.unique()) == [0, 1]
这是我找到的最有效的解决方案。这比上面的答案要快。当处理大型数据集时,时间上的差异变得相关。
brtdzjyr3#
为了扩展上面的答案,使用value_counts().index而不是unique()应该可以做到这一点:
bool_cols = [col for col in df if df[col].dropna().value_counts().index.isin([0,1]).all()]
a8jjtwal4#
使用 Alexandria 的答案,Python版本-3.6.6
[col for col in df if np.isin(df[col].unique(), [0, 1]).all()]
xt0899hw5#
改进@Aiden以避免返回空列:
[col for col in df if (len(df[col].value_counts()) > 0) & all(df[col].value_counts().index.isin([0, 1]))]
ffscu2ro6#
我可能会迟到。但是,我们也可能需要获得具有二进制出现特征的列,这些特征不一定已经是[0,1]格式,即“是/否”,“真/假”,下面可以做。
binary_cols= [col for col in df.columns if len(df[col].unique())==2] binary_cols
elcex8rz7#
你可以在数据集中的每一列上使用pandas的unique()函数。例如:df["colname"].unique()这将返回指定列中所有唯一值的列表。还可以使用for循环遍历数据集中的所有列。型号:[df[cols].unique() for cols in df]
df["colname"].unique()
[df[cols].unique() for cols in df]
ijxebb2r8#
虽然晚了很多年,但下面是我使用nunique()的答案:
nunique()
[col for col,val in df.nunique().items() if val==2]
8条答案
按热度按时间5n0oy7gb1#
据我所知,没有直接的函数来测试这一点。相反,您需要根据数据的编码方式构建一些东西(例如1/0、T/F、真/假等)。此外,如果您的列有缺失值,则整个列将被编码为float而不是int。
在下面的示例中,我测试所有唯一的非空值是否为“1”或“0”。它返回所有此类列的列表。
zfciruhq2#
这是我找到的最有效的解决方案。这比上面的答案要快。当处理大型数据集时,时间上的差异变得相关。
brtdzjyr3#
为了扩展上面的答案,使用value_counts().index而不是unique()应该可以做到这一点:
a8jjtwal4#
使用 Alexandria 的答案,Python版本-3.6.6
xt0899hw5#
改进@Aiden以避免返回空列:
ffscu2ro6#
我可能会迟到。但是,我们也可能需要获得具有二进制出现特征的列,这些特征不一定已经是[0,1]格式,即“是/否”,“真/假”,下面可以做。
elcex8rz7#
你可以在数据集中的每一列上使用pandas的unique()函数。
例如:
df["colname"].unique()
这将返回指定列中所有唯一值的列表。
还可以使用for循环遍历数据集中的所有列。
型号:
[df[cols].unique() for cols in df]
ijxebb2r8#
虽然晚了很多年,但下面是我使用
nunique()
的答案: