如何将数据框列数据添加到另一个数据框中的一系列索引?

时间:2019-07-21 21:31:29

标签: python pandas dataframe

我有一个名为df1的数据框:

        Long_ID     IndexBegin         IndexEnd
0       10000001        0                  3
1       10000002        3                  6
2       10000003        6                 10            

我有第二个数据帧,称为df2,最长可达一百万行:

      Short_ID
0        1
1        2
2        3
3        10
4        20
5        30
6        100
7        101
8        102
9        103

我想将Long_ID链接到Short_ID,如果(IndexBeginIndexEnd)为(0:3),则Long_ID被插入到索引{0}到索引2(df2)的IndexEnd - 1中。起始索引和终止索引是使用df1的最后两列来确定的。

所以最终,我的最终数据帧看起来像这样:df3

      Short_ID       Long_ID
0        1          10000001
1        2          10000001
2        3          10000001
3        10         10000002
4        20         10000002
5        30         10000002
6        100        10000003
7        101        10000003
8        102        10000003
9        103        10000003

首先,我尝试将df2的索引作为键,将Short_ID的索引作为值存储在字典中,然后逐行进行迭代,但这太慢了。这使我学习了向量化技术。

然后,我尝试使用where(),但收到“ ValueError:只能比较标记相同的Series对象”。

df2 = df2.reset_index()
df2['Long_ID'] = df1['Long_ID'] [ (df2['index'] < df1['IndexEnd']) & (df2['index'] >= df1['IndexBegin']) ]

我对编程还比较陌生,如果有人可以提供更好的方法来解决此问题,我将不胜感激。我转载了以下代码:

df1_data = [(10000001, 0, 3), (10000002, 3, 6), (10000003, 6, 10)]
df1 = pd.DataFrame(df1_data, columns = ['Long_ID', 'IndexBegin', 'IndexEnd'])

df2_data = [1, 2, 3, 10, 20, 30, 100, 101, 102, 103]
df2 = pd.DataFrame(df2_data, columns = ['Short_ID'])

5 个答案:

答案 0 :(得分:4)

df2不需要“ IndexEnd”,只要范围是连续的即可。您可以使用pd.merge_asof

(pd.merge_asof(df2.reset_index(), df1, left_on='index', right_on='IndexBegin')
   .reindex(['Short_ID', 'Long_ID'], axis=1))

   Short_ID   Long_ID
0         1  10000001
1         2  10000001
2         3  10000001
3        10  10000002
4        20  10000002
5        30  10000002
6       100  10000003
7       101  10000003
8       102  10000003
9       103  10000003

答案 1 :(得分:2)

这是使用IntervalIndex

的一种方法
df1.index=pd.IntervalIndex.from_arrays(left=df1.IndexBegin,right=df1.IndexEnd,closed='left')
df2['New']=df1.loc[df2.index,'Long_ID'].values

答案 2 :(得分:0)

您可以这样做:

df3 = df2.copy()
df3['long_ID'] =  df2.merge(df1, left_on =df2.index,right_on = "IndexBegin", how = 'left').Long_ID.ffill().astype(int)

答案 3 :(得分:0)

我创建了一个函数来解决您的问题。希望对您有所帮助。

df = pd.read_excel('C:/Users/me/Desktop/Sovrflw_data_2.xlsx')
df

    Long_ID     IndexBegin  IndexEnd
0   10000001    0           3
1   10000002    3           6
2   10000003    6           10

df2 = pd.read_excel('C:/Users/me/Desktop/Sovrflw_data.xlsx')
df2

    Short_ID
0   1
1   2
2   3
3   10
4   20
5   30
6   100
7   101
8   102
9   103

def convert_Short_ID(df1,df2):
    df2['Long_ID'] = None
    for i in range(len(df2)):
        for j in range(len(df)):
            if (df2.index[i] >= df.loc[j,'IndexBegin']) and (df2.index[i] < df.loc[j,'IndexEnd']):
                number = str(df.iloc[j, 0])
                df2.loc[i,'Long_ID'] = df.loc[j, 'Long_ID']
                break
            else:
                df2.loc[i, 'Long_ID'] = np.nan

    df2['Long_ID'] = df2['Long_ID'].astype(str)
    return df2

convert_Short_ID(df,df2)   
    Short_ID    Long_ID
0   1           10000001
1   2           10000001
2   3           10000001
3   10          10000002
4   20          10000002
5   30          10000002
6   100         10000003
7   101         10000003
8   102         10000003
9   103         10000003

答案 4 :(得分:0)

在创建数据框之前使用Numpy创建数据是一种更好的方法,因为向数据框添加元素非常耗时。所以:

import numpy as np
import pandas as pd

#Step 1: creating the first Data Frame
df1 = pd.DataFrame({'Long_ID':[10000001,10000002,10000003],
                 'IndexBegin':[0,3,6],
                   'IndexEnd':[3,6,10]})

#Step 2: creating the second chunk of data as a Numpy array
Short_ID = np.array([1,2,3,10,20,30,100,101,102,103])

#Step 3: creating a new column on df1 to count Long_ID ocurrences
df1['Qt']=df1['IndexEnd']-df1['IndexBegin']

#Step 4: using append to create a Numpy Array for the Long_ID item 
Long_ID = np.array([])
for i in range(len(df1)):
    Long_ID = np.append(Long_ID, [df1['Long_ID'][i]]*df1['Qt'][i])

#Finally, create the seconc Data Frame using both previous Numpy arrays
df2 = pd.DataFrame(np.vstack((Short_ID, Long_ID)).T, columns=['Short_ID','Long_ID'])
df2
    Short_ID    Long_ID
0        1.0 10000001.0
1        2.0 10000001.0
2        3.0 10000001.0
3       10.0 10000002.0
4       20.0 10000002.0
5       30.0 10000002.0
6      100.0 10000003.0
7      101.0 10000003.0
8      102.0 10000003.0
9      103.0 10000003.0