如何使用具有相同索引的另一个数据框来索引数据框的值?
Posted
技术标签:
【中文标题】如何使用具有相同索引的另一个数据框来索引数据框的值?【英文标题】:How to index the values of a dataframe using another dataframe with the same index? 【发布时间】:2021-04-12 16:44:13 【问题描述】:所以我有 2 个数据框,它们都具有相同的索引和列。我修改了第一个,我希望以某种方式索引第二个,以便它现在是第一个的长度。第一个的代码如下:
import pandas as pd
import numpy as np
df1 = pd.DataFrame('a': ['.81', '1.2', '.67', '.78'],
'b': ['.2', '-.9', '.7', '.89'],
'c': ['.3', '.22', '.4', '.98'],
'd': ['.5', '.45', '.34', '.92'],
index=[0, 1, 2, 3])
df2 = pd.DataFrame('a': ['1', '2', '3', '4'],
'b': ['9', '7', '6', '5'],
'c': ['1', '14', '9', '5'],
'd': ['3', '12', '2', '34'],
index=[0, 1, 2, 3])
count=0
for i in df1.index:
d = pd.DataFrame()
d = df1.iloc[[count]]
count = count+1
d = d.T
d.columns = ['Dates']
try:
d.sort_values(by=['Dates'], inplace=True)
except KeyError:
print(KeyError)
d.dropna(inplace=True)
d['Dates'] = d['Dates'][:10]
print(d)
count = 0
for y in df2.index:
df = pd.DataFrame()
df = df2.iloc[[count]]
count = count+1
df = df.T
df.columns = ['Dates']
df.dropna(inplace=True)
print(df)
Df1 for 循环的输出为:
Dates
b .2
c .3
d .5
a .81
Dates
b -.9
c .22
d .45
a 1.2
Dates
d .34
c .4
a .67
b .7
Dates
a .78
b .89
d .92
c .98
Df2 的输出为:
Dates
a 1
b 9
c 1
d 3
Dates
a 2
b 7
c 14
d 12
Dates
a 3
b 6
c 9
d 2
Dates
a 4
b 5
c 5
d 34
如代码所示,我按从小到大的顺序组织行,然后索引出索引的前 10 行。我知道在这段代码中,许多行不超过 10 个值,但我需要像这样索引的原因是当我使用更大的数据集时,这将是一个问题。所以现在我想使用第一个数据帧的索引来索引第二个数据帧中的值。所以现在说如果第二个数据帧有 30 行,它现在只有 10 行,它基于第一个数据帧的 10。
编辑: 问题是这样的: 对于 df1.index 中的 i: #创建10个新数据框 d = pd.DataFrame() d = df1.iloc[[count]] 计数=计数+1 所以现在这段代码正在做的是基于一个更大的数据框创建 10 个新的数据框。因此,如果我在第二个 for 循环中使用 .loc ,它看起来像: 对于 df2.index 中的 i: #创建10个新数据框 df = pd.DataFrame() df = df2.iloc[[count]] 计数=计数+1 那么如果在第二个 for 循环中你会说 d.loc,这将是一个问题,因为 d 等于在 for 循环中创建的最后一个数据帧,而不是所有数据帧。
【问题讨论】:
请提供一个最小的可重现示例;这样做会更容易为您提供帮助! 感谢您对@zabop 的回复,我可以尝试通过为更少的 2 个 for 循环创建输出来做到这一点。我已经尝试从主代码中将其最小化,并且我尝试在另一个较小的数据集上执行此操作,但我找不到正确执行此操作的方法。是否会创建更小的输出来帮助您解决问题? 是的,创建一个类似于这个问题的 df:***.com/q/63583502/8565438 :) 好的,谢谢 刚刚发现,也有用:***.com/questions/20109391/… 【参考方案1】:使用您的示例数据框,假设df1
通过drop()ping 与index=2
的行变得更小:
df1.drop(2,inplace=True)
df1
现在是:
a b c d
0 .81 .2 .3 .5
1 1.2 -.9 .22 .45
3 .78 .89 .98 .92
您可以以任何您希望的方式修改索引。然后,要从df2
中选择df1
中存在的行,可以这样做:
df2.loc[df1.index]
给你:
a b c d
0 1 9 1 3
1 2 7 14 12
3 4 5 5 34
如果只需要一些列,比如说c
& d
:
df2.loc[df1.index,['c','d']]
给你:
c d
0 1 3
1 14 12
3 5 34
【讨论】:
是的,这确实有帮助,但唯一的问题是 df1 和 df2 是 for 循环中的数据帧,所以如果我尝试在第二个 for 循环中使用 .loc 我会遇到问题,因为df1 是一个数据帧的值,而不是第一个 for 循环创建的所有数据帧的值 我不知道我是否在那里解释得很好,但是,我会在编辑时为这个问题添加一个更好的解释。 所以我认为会有解决方案,一个是我在编辑部分添加到问题中的解决方案,第二个是找到一种方法编写相同的 for 循环代码,尽管没有 for 循环.以上是关于如何使用具有相同索引的另一个数据框来索引数据框的值?的主要内容,如果未能解决你的问题,请参考以下文章
将具有相同列/索引的两个 pandas DataFrame 合并为一个 DataFrame
使用 Python 在 Appium / Android 上选择一个元素,该元素与 UIAutomatorViewer 上的另一个元素具有相同的类和相同的索引