如何同时获得虚拟变量和计数

13 浏览
0 Comments

如何同时获得虚拟变量和计数

我有一个需要清理的大数据集。现在,简化后的数据如下:\n

   A  B  C  D
1  1  5  2  2
4  2  5  3  1
5  3  3  2  1
8  4  1  4  4

\n因此,每一列的值从1到5。\n现在我想将这4列转换为5个虚拟列,并同时计算每行每个值的“数量”,以得到如下结果:\n

   S_1 S_2 S_3 S_4 S_5
1   1   2   0   0   1
4   1   1   1   0   1
5   1   1   2   0   0
8   1   0   0   3   0

\n因此,“S_1”表示每行的“1”的数量,“S_2”表示每行的“2”的数量,依此类推。\n我猜这可以通过透视表来实现,但我不知道怎么做。有人可以帮帮我吗?

0
0 Comments

问题的出现原因:

问题是由于需要对数据进行虚拟编码(get_dummies)和计数(count)两个操作,但是pandas库中的get_dummies函数只能对数据进行虚拟编码,不能同时计数。因此,需要找到一种方法能够同时实现这两个操作。

解决方法:

为了同时实现虚拟编码和计数,可以使用Python中的pandas库和collections库。首先,导入所需的库。然后,创建一个DataFrame对象,其中包含要处理的数据。接下来,定义一个列表categories,其中包含要计数的类别。然后,创建一个空列表rows_counts,用于存储每行的计数结果。接下来,使用双重循环,对每个类别进行计数。在内部循环中,将每行数据转换为列表,并使用count()函数计算每个类别的数量。然后,将计数结果存储在一个默认值为0的字典中。最后,将每行的计数结果添加到rows_counts列表中。最后,将rows_counts列表转换为DataFrame对象,并将列名更改为'S_' +类别。这样就可以同时实现虚拟编码和计数的操作。

整理后的内容如下所示:

import pandas as pd
from collections import defaultdict # Initialize a dictionary with a default value
# 创建DataFrame对象
df = pd.DataFrame(
    [[1,5,2,2],
     [2,5,3,1],
     [3,3,2,1],
     [4,1,4,4]]
    , columns = ['A','B','C','D'])
# 定义要计数的类别
categories = [1,2,3,4,5]
# 创建空列表存储计数结果
rows_counts = []
# 遍历每行数据进行计数
for idx in df.index:
    dict_counts = defaultdict(int)
    
    # 对每个类别进行计数
    for category in categories:
        # 将每行数据转换为列表,并计算每个类别的数量
        row = df.loc[idx,:].tolist()
        dict_counts[category] = row.count(category)
    
    # 将计数结果添加到列表中
    rows_counts.append(dict_counts)
# 将计数结果转换为DataFrame对象,并更改列名
new_df = pd.DataFrame(rows_counts)
new_df.columns = ['S_'+ str(cat) for cat in new_df.columns]

通过上述代码,我们可以同时实现虚拟编码和计数的操作。

0
0 Comments

如何同时获取虚拟变量和计数?

问题的原因是,用户想要在处理数据时同时获取虚拟变量和计数。他们尝试使用collections.Counter来计数出现的次数,并使用Pandas的DataFrame将结果转换为虚拟变量。

解决方法是使用Counter来计数出现的次数,并将结果与一个包含所有可能值的字典进行合并。然后,将结果转换为DataFrame,并用0填充缺失值。最后,将列重命名为'S_1','S_2'等。

以下是解决方法的代码:

import pandas as pd
from collections import Counter
# 创建数据
data = [[1, 5, 2, 2],
        [2, 5, 3, 1],
        [3, 3, 2, 1],
        [4, 1, 4, 4]]
df = pd.DataFrame(data=data, columns=['A', 'B', 'C', 'D'], index=[1, 4, 5, 8])
# 创建一个包含所有可能值的字典
total = {k: 0 for k in range(1, 6)}
# 使用Counter计数,并将结果与total合并
result = pd.DataFrame([{**total, **Counter(row)} for row in df.values], index=df.index)
# 重命名列,并用0填充缺失值
result = result.rename(columns={k: f'S_{k}' for k in total}).fillna(0)
print(result)

输出结果如下:

   S_1  S_2  S_3  S_4  S_5
1    1    2    0    0    1
4    1    1    1    0    1
5    1    1    2    0    0
8    1    0    0    3    0

通过这种方法,用户既可以获取虚拟变量,又可以计算出现的次数。这对于处理数据集中的分类变量非常有用。

0