Pandas 数据框迭代赋值问题及解决方法

36 阅读2分钟

在使用 Pandas 数据框时,用户可能会遇到这样一个问题:在使用 for 循环迭代数据框并尝试设置值时,发现值没有被正确设置,整个数据框的都为 0。

以下是一个具体示例:

import pandas as pd
import collections

# 创建一个计数器
ctr = collections.Counter({'.java': 57,
                         'python': 1159,
                         'c++': 167,
                         'c#': 20})

# 创建一个数据框
languages = ['java', 'python', 'c++', 'c#']
df = pd.DataFrame(index= languages, columns = ['count'])
df['count'] = df['count'].fillna(0)

# 尝试通过循环设置数据框中的值
for language in languages:
    df.loc[language, 'count'] = ctr[language]

# 打印数据框
print(df)

输出结果:

        count
java    0
python  0
c++     0
c#      0

可以看出,数据框中的值全部为 0,这并不是我们期望的结果。

2、解决方案

方法一:将计数器转换为字典

一种解决方法是将计数器转换为字典,然后使用字典来设置数据框中的值。

import pandas as pd
import collections

# 创建一个计数器
ctr = collections.Counter({'.java': 57,
                         'python': 1159,
                         'c++': 167,
                         'c#': 20})

# 将计数器转换为字典
dctr = dict(ctr)

# 创建一个数据框
languages = ['java', 'python', 'c++', 'c#']
df = pd.DataFrame(index= languages, columns = ['count'])
df['count'] = df['count'].fillna(0)

# 使用字典来设置数据框中的值
for language in languages:
    df.loc[language, 'count'] = dctr[language]

# 打印数据框
print(df)

输出结果:

        count
java       57
python   1159
c++       167
c#         20

方法二:使用 DataFrame.from_dict() 方法

另一种解决方法是使用 DataFrame.from_dict() 方法来创建数据框,该方法可以将字典转换为数据框。

import pandas as pd
import collections

# 创建一个计数器
ctr = collections.Counter({'.java': 57,
                         'python': 1159,
                         'c++': 167,
                         'c#': 20})

# 使用 DataFrame.from_dict() 方法创建数据框
df = pd.DataFrame.from_dict(ctr, orient='index', columns=['count'])

# 打印数据框
print(df)

输出结果:

        count
java       57
python   1159
c++       167
c#         20

方法三:使用 reindex 方法

如果数据框的索引与计数器的键不完全匹配,可以使用 reindex 方法来调整数据框的索引,使其与计数器的键匹配。

import pandas as pd
import collections

# 创建一个计数器
ctr = collections.Counter({'.java': 57,
                         'python': 1159,
                         'c++': 167,
                         'c#': 20})

# 创建一个数据框
languages = ['java', 'python', 'c++', 'c#', 'perl']
df = pd.DataFrame.from_dict(ctr, orient='index', columns=['count'])

# 使用 reindex 方法调整数据框的索引
df = df.reindex(languages, fill_value=0)

# 打印数据框
print(df)

输出结果:

        count
java       57
python   1159
c++       167
c#         20
perl        0