如何按索引匹配拼接不同长度DataFrame列字符串及问题排查
解决不同长度DataFrame索引匹配行的字符串拼接问题
问题描述
需要将两个不同长度的DataFrame(df1有1000条数据,df2有100条)中索引匹配的行的File-Name:列字符串进行拼接,同时保留df1中未匹配的900条数据的原内容。但使用以下代码后,df1中未匹配行的File-Name:列变为NaN,仅匹配行拼接正确:
df1["File-Name:"] = df1["File-Name:"].str.cat(df2["File-Name:"])
示例数据
df1示例:
File-Name: date-time: Size: 0 ./.c9 2024-04-26 18:07 830172 1 ./.nvm 2024-03-29 19:09 506588 ... 14 ./.c9/dependencies/... 2024-03-06 19:27 166936
df2示例:
File-Name: 14 85de0311e77fec00f3ce2303de1affbe390e7b22b96402f... 18 e04e9ef74933c4cab24ec0f62a973d0b06e59e466286a73... ...
问题原因
str.cat()方法在拼接时,如果对应的df2行不存在(即df1索引在df2中无匹配),会将df2对应位置视为NaN。字符串与NaN拼接的结果为NaN,导致df1未匹配行的原内容被覆盖。
解决方案
提供两种可行的解决方法,按需选择:
方法1:仅对共同索引行进行拼接(高效)
先提取两个DataFrame的共同索引,仅对这些索引的行执行拼接操作,不影响其他行的原内容:
# 获取df1和df2的共同索引 common_idx = df1.index.intersection(df2.index) # 仅对共同索引的行拼接字符串 df1.loc[common_idx, "File-Name:"] += df2.loc[common_idx, "File-Name:"]
方法2:对齐索引后拼接(简洁)
将df2的File-Name:列按df1的索引重新对齐,缺失位置填充空字符串,再执行拼接:
# 重新对齐df2的索引,缺失位置填充空字符串 aligned_df2_col = df2["File-Name:"].reindex(df1.index, fill_value="") # 拼接字符串,未匹配行因拼接空字符串保持原内容 df1["File-Name:"] = df1["File-Name:"].str.cat(aligned_df2_col)
两种方法都能实现目标:未匹配行保留原File-Name:内容,匹配行完成字符串拼接。
内容的提问来源于stack exchange,提问作者tooDeeStoned
相关产品推荐
相关产品推荐

