如何使用具有相同索引的另一个数据帧来索引数据帧的值?

时间:2021-01-06 22:32:10

标签: python pandas dataframe indexing

所以我有 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[[计数]] 计数=计数+1 所以现在这段代码正在做的是基于一个更大的数据帧创建 10 个新的数据帧。那么如果我在第二个 for 循环中使用 .loc ,它看起来像: 对于 df2.index 中的 i: #创建10个新数据帧 df = pd.DataFrame() df = df2.iloc[[计数]] 计数=计数+1 那么如果在这个第二个 for 循环中你会说 d.loc,这将是一个问题,因为 d 等于在 for 循环中创建的最后一个数据帧,而不是全部。

1 个答案:

答案 0 :(得分:0)

使用你的例子dataframes,假设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

如果只需要某些列,让我们说cd

df2.loc[df1.index,['c','d']]

给你:

    c   d
0   1   3
1  14  12
3   5  34