基于列表和其他df创建新的Pandas数据帧

时间:2018-04-22 14:22:00

标签: python pandas dataframe

我有以下格式的pandas df:

Index | Article | Reference | Text

1 --------- 1 ------3, 4, 5 ------| xyz1

2 --------- 2 ------5, 9, 10 ----  | xyz2

3 ....

引用是针对其他文章的,我想创建一个新的df,它显示文章旁边的每篇文章和文本以及它引用的文本。所以对于上面的例子:

Index | Article1 | Text1 | Article2 | Text2 | 

1 --------- 1 ------ xyz1 -------3 ------- xyz3

2 --------- 1 ------ xyz1 -------4 ------- xyz4

3 --------- 1 ------ xyz1 -------5 ------- xyz5

4 --------- 2 ------ xyz2 -------5 ------- xyz5

5 --------- 2 ------ xyz2 -------9 ------- xyz9

6 --------- 2 ------ xyz2 -------10 ------ xyz10

下面的代码给了我一个空框架,我似乎无法找到问题。

frame = pd.DataFrame(columns = ['Article1', 'Text1', 'Article2', 'Text2'])
frame.index = frame.index + 1

for x in range (1, len(df)):
    numbers = df['References'][x]
    numbers = list(map(int, numbers))
    for y in range (1, len(df)):
        if y in numbers:
            frame['Article1']= df['Article'][x]
            frame['Text1'] = df['Text'][x]
            frame['Article2'] = df['Article'][y]
            frame['Text2'] = df['Text'][y]

1 个答案:

答案 0 :(得分:0)

我认为需要通过按chain.from_iterable展平DataFrame来创建新的Text2,其中numpy.repeat重复行,而Series列使用map {{3}} {{3}} 1}}从原始DataFrame创建,并为同一integer投射到types

print (df)
   Article Reference  Text
1        1   3, 4, 5  xyz1
2        2  5, 9, 10  xyz2
3        3   1, 2, 3  xyz3

from itertools import chain

s = df['Reference'].str.split(',\s+')
lens = s.str.len()
df1 = pd.DataFrame({
    'Article2' : list(chain.from_iterable(s)), 
    'Article1' : df['Article'].values.repeat(lens),
    'Text1' : df['Text'].values.repeat(lens),
}, columns=['Article1','Text1','Article2'])

df1['Text2'] = df1['Article2'].astype(int).map(df.set_index('Article')['Text'])
print (df1)
   Article1 Text1 Article2 Text2
0         1  xyz1        3  xyz3
1         1  xyz1        4   NaN
2         1  xyz1        5   NaN
3         2  xyz2        5   NaN
4         2  xyz2        9   NaN
5         2  xyz2       10   NaN
6         3  xyz3        1  xyz1
7         3  xyz3        2  xyz2
8         3  xyz3        3  xyz3