
本文旨在解决使用 Pandas 向 DataFrame 添加新列时,列名成功添加但数据为空的问题。通过分析常见原因,提供多种解决方案,包括使用 np.where 条件赋值、正确理解 pd.concat 的用法,以及避免在循环中修改 DataFrame 等,帮助读者高效地向 DataFrame 添加所需数据。
在使用 Pandas 处理 Excel 数据时,经常需要在 DataFrame 中添加新的列。然而,有时会出现添加了列名,但列中的数据却为空的情况。 这通常是由于多种原因造成的,例如赋值方式不正确、循环中的错误操作,或者对 Pandas 函数的理解有偏差。以下将针对这些常见问题,提供详细的解决方案。
如果新列的值取决于其他列的条件判断,可以使用 numpy.where 函数进行条件赋值。 这种方法简洁高效,避免了使用循环遍历 DataFrame 的低效操作。
import pandas as pd
import numpy as np
# 示例 DataFrame
data = {'cellname1': ['A', 'B', 'C', 'A'],
'cellname1value': [1, 2, 3, 1],
'cellname2': ['A', 'D', 'C', 'B'],
'cellname2value': [1, 4, 3, 5],
'cellname3': ['A', 'B', 'E', 'A'],
'cellname3value': [1, 2, 6, 1]}
df = pd.DataFrame(data)
# 添加新列,初始值为空
df['resultcellname'] = ''
df['resultcellnamevalue'] = ''
# 使用 np.where 进行条件赋值
df['resultcellname'] = np.where((df['cellname1'] == df['cellname2']) & (df['cellname1value'] == df['cellname2value']), df['cellname1'], df['resultcellname'])
df['resultcellnamevalue'] = np.where((df['cellname1'] == df['cellname2']) & (df['cellname1value'] == df['cellname2value']), df['cellname1value'], df['resultcellnamevalue'])
df['resultcellname'] = np.where((df['cellname1'] == df['cellname3']) & (df['cellname1value'] == df['cellname3value']), df['cellname1'], df['resultcellname'])
df['resultcellnamevalue'] = np.where((df['cellname1'] == df['cellname3']) & (df['cellname1value'] == df['cellname3value']), df['cellname1value'], df['resultcellnamevalue'])
df['resultcellname'] = np.where((df['cellname2'] == df['cellname3']) & (df['cellname2value'] == df['cellname3value']), df['cellname2'], df['resultcellname'])
df['resultcellnamevalue'] = np.where((df['cellname2'] == df['cellname3']) & (df['cellname2value'] == df['cellname3value']), df['cellname2value'], df['resultcellnamevalue'])
print(df)代码解释:
注意事项:
在循环中直接修改 DataFrame 是一个非常低效的操作,尤其是在处理大型数据集时。 每次修改都会导致 Pandas 重新分配内存,从而显著降低性能。 建议尽量避免在循环中修改 DataFrame,而是先将需要添加的数据存储在一个列表中,最后一次性添加到 DataFrame 中。
import pandas as pd
# 示例 DataFrame
data = {'col1': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)
# 创建一个空列表,用于存储新列的数据
new_col_data = []
# 循环遍历 DataFrame 的每一行
for index, row in df.iterrows():
# 根据某些条件计算新列的值
if row['col1'] > 3:
new_value = row['col1'] * 2
else:
new_value = row['col1'] + 1
# 将新值添加到列表中
new_col_data.append(new_value)
# 将列表添加到 DataFrame 中
df['new_col'] = new_col_data
print(df)代码解释:
注意事项:
pd.concat 函数用于连接 Pandas 对象,包括 DataFrame 和 Series。 如果使用不当,可能会导致数据丢失或产生意想不到的结果。
在提供的原始代码中,存在以下问题:
dfH=pd.concat([dfH.loc[common_values]],
axis=1)这行代码试图将 dfH.loc[common_values] 与 dfH 沿列方向连接,但是 dfH.loc[common_values] 的结果可能不是你想要的。 dfH.loc[common_values] 会尝试根据 common_values 中的值作为索引来选择 dfH 中的行。 如果 common_values 中的值不是 dfH 的索引,则会出错。 即使 common_values 中的值是 dfH 的索引,连接后的结果也可能不是你期望的。
正确的用法:
如果想要将一个 Series 或 DataFrame 添加到现有的 DataFrame 中,可以直接赋值:
dfH['new_column'] = some_series
或者,如果确实需要使用 pd.concat,请确保连接的对象具有相同的索引,并且指定正确的 axis。
总结:
在向 Pandas DataFrame 添加新列时,需要注意赋值方式、避免在循环中修改 DataFrame,以及正确理解 Pandas 函数的用法。 通过选择合适的解决方案,可以高效地向 DataFrame 添加所需数据,并避免出现数据为空的问题。
以上就是Pandas DataFrame 添加新列但无数据问题解决方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号