在使用 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