如何修复混淆的索引
How to fix mixed up indexes
我对数据框中的索引有疑问。我有一个看起来像这样的数据:
df1 = pd.DataFrame({'Name': ['ABC-123', 'DEF-456', 'GHI-789', 'JKL-321'],
'A1': [111, 222, 333, 444],
'A2': [555, 666, 777, 888],
'A3': [999, 123, 456, 789],
'A4': [101, 202, 303, 404],
'QQ': [1.3, 2.5, 3.7, 4.9]});
我正在处理数据,在某些时候我创建了一个类似的数据框,其中包含原始数据中的一些数据,但是某处发生了数据索引的混合,所以新数据看起来像这样:
df2 = pd.DataFrame({'A1': [444, 222, 111, 333],
'A2': [888, 666, 555, 777],
'A3': [789, 123, 999, 456],
'A4': [404, 202, 101, 303]});
行中的数据没问题,只是索引有误,所以我需要原样的新数据框,但第二个数据框中的行索引与第一个数据框中的索引匹配,例如数字为 444、888、789 和 404 的第一行应该有索引 3,而不是 0。我该怎么做?我应该将第二个数据帧的每一行与第一个数据帧进行比较,如果第二个数据帧中的行与第一个数据帧的一行中的数据匹配,则将第二个数据帧中该行的索引更改为匹配行的索引第一个数据框的,但我不知道该怎么做。有什么建议吗?
评论更新:
- 我需要那些索引,但我需要它们,所以它们匹配,即第二个 table 中的索引跟在第一个中的索引之后。另外,我不能单独使用任何列,因为 non 是唯一的。只有整行是唯一的。
- 我应该补充一点,那两个 table 不是真实的,而是作为示例创建的,现在我发现 ID 列具有误导性。我已将其更改为 AA,以避免混淆。所以,正如我上面所说,列不是唯一的,只有整个行是唯一的。真正的 table 有超过 200 列和数千行。
- 我无法包含代码,因为它又大又复杂,而且我不知道混淆发生在哪里。这也是无关紧要的,因为我正在谈论的数据已经收集并保存在 CSV 文件中,所以这两个数据帧实际上是从这些文件中导入的。这是我的问题。我无法重新运行原始代码,即使我修复了它,因为这需要两周的时间。我必须修复第二个数据帧中的索引,我怀疑如果知道该怎么做的话并没有那么复杂。正如我所说,行中的数据很好,只是索引混淆了
- 不是的,这只是这个东西的一个名字,其余的数据都是关于。索引是指数据帧索引,因为它是在创建数据帧时默认由 pandas 创建的。整个问题是,我通过从 CSV 文件导入数据创建了第一个数据帧,对该数据做了一些非常耗时的工作,并将结果导出到另一个 CSV 文件。稍后我导入第二个 CSV 文件进行分析时,我发现具有相同数据的行的索引不匹配。所以现在我必须修复索引,否则我将失去大约两周的工作
- 是的,它是行和列的子集。数据应该是一样的,只是索引混淆了。如果我可以将 df2 的每一行与 df1 进行比较,找出 df1 中该行数据的索引是什么,然后更改 df2 中该行的索引,这将解决问题。我只需要 df2 中的行索引与 df1 的相关行索引相匹配。 df2 索引是混合的。 df1 中的索引与两个数据帧中的索引一样。
- 不是,df2只有df1的一些列和df1的一些行,但是数据会在它们之间匹配。顺序不同,这意味着索引不同,如果相同的话。但我想有可能对行进行排序,索引没有按顺序排列。
pandas.concat
两个数据帧
concat
两个数据框,但只在两个 中的列上
- 串联的顺序很重要,
df1
需要放在第一位
df1
将带来不在 df2
中的行
- 使用
.duplicated
创建遮罩
df1
和 df2
之间的所有匹配行将为 True
,但 df1
中的额外行将为 False
- 应用掩码,这将删除多余的行
dfc
现在将只有重复的行,并且来自 df1
的所有行将排在第一个
- 最后,
.drop_duplicates
和 keep='first'
将删除 dfc
底部的所有重复项,从而仅保留 df1
中具有正确索引的行。
import pandas as pd
# concat dataframes
dfc = pd.concat([df1[df2.columns], df2])
# drop non-duplicate rows and then drop duplicates, but keep the 1st
df2_correct_indices = dfc[dfc.duplicated(keep=False)].drop_duplicates(keep='first')
# display(df2_correct_indices)
A1 A2 A3 A4
0 111 555 999 101
1 222 666 123 202
2 333 777 456 303
3 444 888 789 404
使用的示例数据
df1
df1 = pd.DataFrame({'Name': ['ABC-123', 'DEF-456', 'GHI-789', 'JKL-321', 'not_in_df2'],
'A1': [111, 222, 333, 444, 1000],
'A2': [555, 666, 777, 888, 1000],
'A3': [999, 123, 456, 789, 1000],
'A4': [101, 202, 303, 404, 1000],
'QQ': [1.3, 2.5, 3.7, 4.9, 1000]})
Name A1 A2 A3 A4 QQ
0 ABC-123 111 555 999 101 1.3
1 DEF-456 222 666 123 202 2.5
2 GHI-789 333 777 456 303 3.7
3 JKL-321 444 888 789 404 4.9
4 not_in_df2 1000 1000 1000 1000 1000.0
df2
df2 = pd.DataFrame({'A1': [444, 222, 111, 333],
'A2': [888, 666, 555, 777],
'A3': [789, 123, 999, 456],
'A4': [404, 202, 101, 303]})
A1 A2 A3 A4
0 444 888 789 404
1 222 666 123 202
2 111 555 999 101
3 333 777 456 303
我对数据框中的索引有疑问。我有一个看起来像这样的数据:
df1 = pd.DataFrame({'Name': ['ABC-123', 'DEF-456', 'GHI-789', 'JKL-321'],
'A1': [111, 222, 333, 444],
'A2': [555, 666, 777, 888],
'A3': [999, 123, 456, 789],
'A4': [101, 202, 303, 404],
'QQ': [1.3, 2.5, 3.7, 4.9]});
我正在处理数据,在某些时候我创建了一个类似的数据框,其中包含原始数据中的一些数据,但是某处发生了数据索引的混合,所以新数据看起来像这样:
df2 = pd.DataFrame({'A1': [444, 222, 111, 333],
'A2': [888, 666, 555, 777],
'A3': [789, 123, 999, 456],
'A4': [404, 202, 101, 303]});
行中的数据没问题,只是索引有误,所以我需要原样的新数据框,但第二个数据框中的行索引与第一个数据框中的索引匹配,例如数字为 444、888、789 和 404 的第一行应该有索引 3,而不是 0。我该怎么做?我应该将第二个数据帧的每一行与第一个数据帧进行比较,如果第二个数据帧中的行与第一个数据帧的一行中的数据匹配,则将第二个数据帧中该行的索引更改为匹配行的索引第一个数据框的,但我不知道该怎么做。有什么建议吗?
评论更新:
- 我需要那些索引,但我需要它们,所以它们匹配,即第二个 table 中的索引跟在第一个中的索引之后。另外,我不能单独使用任何列,因为 non 是唯一的。只有整行是唯一的。
- 我应该补充一点,那两个 table 不是真实的,而是作为示例创建的,现在我发现 ID 列具有误导性。我已将其更改为 AA,以避免混淆。所以,正如我上面所说,列不是唯一的,只有整个行是唯一的。真正的 table 有超过 200 列和数千行。
- 我无法包含代码,因为它又大又复杂,而且我不知道混淆发生在哪里。这也是无关紧要的,因为我正在谈论的数据已经收集并保存在 CSV 文件中,所以这两个数据帧实际上是从这些文件中导入的。这是我的问题。我无法重新运行原始代码,即使我修复了它,因为这需要两周的时间。我必须修复第二个数据帧中的索引,我怀疑如果知道该怎么做的话并没有那么复杂。正如我所说,行中的数据很好,只是索引混淆了
- 不是的,这只是这个东西的一个名字,其余的数据都是关于。索引是指数据帧索引,因为它是在创建数据帧时默认由 pandas 创建的。整个问题是,我通过从 CSV 文件导入数据创建了第一个数据帧,对该数据做了一些非常耗时的工作,并将结果导出到另一个 CSV 文件。稍后我导入第二个 CSV 文件进行分析时,我发现具有相同数据的行的索引不匹配。所以现在我必须修复索引,否则我将失去大约两周的工作
- 是的,它是行和列的子集。数据应该是一样的,只是索引混淆了。如果我可以将 df2 的每一行与 df1 进行比较,找出 df1 中该行数据的索引是什么,然后更改 df2 中该行的索引,这将解决问题。我只需要 df2 中的行索引与 df1 的相关行索引相匹配。 df2 索引是混合的。 df1 中的索引与两个数据帧中的索引一样。
- 不是,df2只有df1的一些列和df1的一些行,但是数据会在它们之间匹配。顺序不同,这意味着索引不同,如果相同的话。但我想有可能对行进行排序,索引没有按顺序排列。
pandas.concat
两个数据帧concat
两个数据框,但只在两个 中的列上
- 串联的顺序很重要,
df1
需要放在第一位 df1
将带来不在df2
中的行
- 使用
.duplicated
创建遮罩df1
和df2
之间的所有匹配行将为True
,但df1
中的额外行将为False
- 应用掩码,这将删除多余的行
dfc
现在将只有重复的行,并且来自df1
的所有行将排在第一个
- 最后,
.drop_duplicates
和keep='first'
将删除dfc
底部的所有重复项,从而仅保留df1
中具有正确索引的行。
import pandas as pd
# concat dataframes
dfc = pd.concat([df1[df2.columns], df2])
# drop non-duplicate rows and then drop duplicates, but keep the 1st
df2_correct_indices = dfc[dfc.duplicated(keep=False)].drop_duplicates(keep='first')
# display(df2_correct_indices)
A1 A2 A3 A4
0 111 555 999 101
1 222 666 123 202
2 333 777 456 303
3 444 888 789 404
使用的示例数据
df1
df1 = pd.DataFrame({'Name': ['ABC-123', 'DEF-456', 'GHI-789', 'JKL-321', 'not_in_df2'],
'A1': [111, 222, 333, 444, 1000],
'A2': [555, 666, 777, 888, 1000],
'A3': [999, 123, 456, 789, 1000],
'A4': [101, 202, 303, 404, 1000],
'QQ': [1.3, 2.5, 3.7, 4.9, 1000]})
Name A1 A2 A3 A4 QQ
0 ABC-123 111 555 999 101 1.3
1 DEF-456 222 666 123 202 2.5
2 GHI-789 333 777 456 303 3.7
3 JKL-321 444 888 789 404 4.9
4 not_in_df2 1000 1000 1000 1000 1000.0
df2
df2 = pd.DataFrame({'A1': [444, 222, 111, 333],
'A2': [888, 666, 555, 777],
'A3': [789, 123, 999, 456],
'A4': [404, 202, 101, 303]})
A1 A2 A3 A4
0 444 888 789 404
1 222 666 123 202
2 111 555 999 101
3 333 777 456 303