Pandas DataFrame - 列出具有最低不同值的列

时间:2018-01-16 16:55:35

标签: python pandas

我有以下代码来查找具有最少数量的不同值的数据框中的列并列出它们。

import pandas as pd

df = pd.DataFrame({"A": [1,2,3], "B": [2,3,4],"C":[1,1,2],"D":[3,3,4]})
print(df)
unique_counts = df.nunique()

lowest_distinct = 100
#
#Find the lowest distinct count across all columns
#
for column_name, distinct_count in unique_counts.iteritems():

    if distinct_count < lowest_distinct:
        lowest_distinct = distinct_count

lowest_distinct_columns = []
#
#Collect the columns having that count
#
for column_name, distinct_count in unique_counts.iteritems():

    if distinct_count == lowest_distinct:
        lowest_distinct_columns.append(column_name)

#
#Get the columns and values returned as a data frame
#
melted_df = df.melt(value_vars=lowest_distinct_columns,var_name='column', value_name='value')

print(melted_df)

感觉有点笨重,所以我想知道是否有更好的方法吗?最后,我试图获得具有最少数量的不同值的列和值的列表。

任何想法或提示表示赞赏。

干杯

大卫

4 个答案:

答案 0 :(得分:1)

它能做你想做的事吗:

unique_counts = df.nunique()
lowest_distinct = unique_counts.min()
lowest_distinct_columns = unique_counts[unique_counts == lowest_distinct].index.tolist()

result = pd.DataFrame({col: df[col].unique() for col in lowest_distinct_columns})

答案 1 :(得分:1)

对于旧版本的pandas(&lt; v.20),请考虑apply返回一个系列:

unique_ser = df.apply(lambda col: col.nunique(), axis=0)
print(unique_ser)
# A    3
# B    3
# C    2
# D    2

lowest_unique_ser = unique_ser[unique_ser == unique_ser.min()]
print(lowest_unique_ser)
# C    2
# D    2

final_ser = df[lowest_unique_ser.index].apply(lambda col: col.unique().tolist(), axis=0)
print(final_ser)
# C    (1, 2)
# D    (3, 4)

答案 2 :(得分:1)

使用

    from uber_rides.auth import AuthorizationCodeGrant
    auth_flow = AuthorizationCodeGrant(
        <CLIENT_ID>,
        <SCOPES>,
        <CLIENT_SECRET>,
        <REDIRECT_URI>
    )

auth_url = auth_flow.get_authorization_url()

答案 3 :(得分:0)

感谢您的回复。解决问题第一部分的3个解决方案同样有效,对问题第二部分的2个响应也很有效。

我需要在实践中使用它们来查看性能或行为是否存在任何重大差异,但总结完整的解决方案:

@ Parfait的解决方案:

unique_ser = df.apply(lambda col: col.nunique(), axis=0)
print(unique_ser)
# A    3
# B    3
# C    2
# D    2

lowest_unique_ser = unique_ser[unique_ser == unique_ser.min()]
print(lowest_unique_ser)
# C    2
# D    2

final_ser = df[lowest_unique_ser.index].apply(lambda col: col.unique().tolist(), axis=0)
print(final_ser)
# C    (1, 2)
# D    (3, 4)

和@Priker's

unique_counts = df.nunique()
lowest_distinct = unique_counts.min()
lowest_distinct_columns = unique_counts[unique_counts == 
lowest_distinct].index.tolist()

result = pd.DataFrame({col: df[col].unique() for col in lowest_distinct_columns})