我有以下格式的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]
答案 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