Pandas: 如何根据频率分布将遵循幂律的数据帧的一列拆分为两列?
Pandas: How to split a column of a dataframe, which follows powerlaw into two based on frequency distribution?
我有一个包含 5 列的 100 万条记录的数据框。
unique_index,name,company_name,city_id,state_id
列 company_name
有 10 万条唯一记录。这遵循幂律。前 5000 名 company_names
覆盖了 70% 的记录。
我想从贡献数据前 5000 名的公司和其余的公司中获取相同数量的样本。
我试过了pd.qcut(df['company_name'],[0.25,1]
。这给了我以下错误:
TypeError: unorderable types: str() <= float()
。 qcut
不能应用于字符串吗?
您可以尝试通过 value_counts()
获取排名靠前的公司,然后如果是 in/out 排名靠前的公司,则使用 True/False
创建一个新列。我认为它看起来像这样:
top5000 = df['company_name'].value_counts().index[0:5000].tolist()
df['InTop'] = df['company_name'].isin(top5000)
这将允许您从 df['InTop'] == True
的组和 df['InTop'] == False
的组中抽样
我有一个包含 5 列的 100 万条记录的数据框。
unique_index,name,company_name,city_id,state_id
列 company_name
有 10 万条唯一记录。这遵循幂律。前 5000 名 company_names
覆盖了 70% 的记录。
我想从贡献数据前 5000 名的公司和其余的公司中获取相同数量的样本。
我试过了pd.qcut(df['company_name'],[0.25,1]
。这给了我以下错误:
TypeError: unorderable types: str() <= float()
。 qcut
不能应用于字符串吗?
您可以尝试通过 value_counts()
获取排名靠前的公司,然后如果是 in/out 排名靠前的公司,则使用 True/False
创建一个新列。我认为它看起来像这样:
top5000 = df['company_name'].value_counts().index[0:5000].tolist()
df['InTop'] = df['company_name'].isin(top5000)
这将允许您从 df['InTop'] == True
的组和 df['InTop'] == False