Pandas:尝试使用long-int值创建新的df列时出现OverflowError

时间:2016-09-14 20:43:25

标签: pandas dataframe long-integer

我有一个数据框

      ID       NAME  group_id
0     205292   A     183144058824253894513539088231878865676           
1     475121   B     183144058824253894513539088231878865676
1     475129   C     183144058824253894513539088231878865676

我想对其进行转换,使得第0行以下列方式链接到其他行

   LinkedBy  By_Id    LinkedTo  To_Id   group_id
1  A         205292   B         475121  183144058824253894513539088231878865676
2  A         205292   C         475129  183144058824253894513539088231878865676

基本上,我通过将第0个索引行与所有其他索引行链接来压缩第一个数据帧,使得n行df将给出一个(n-1)行df。我可以通过以下代码在没有组ID(类型为long且保持不变)的情况下完成此操作:

pd.DataFrame({"LinkedBy": df['NAME'].iloc[0],"By_Id": df['ID'].iloc[0],"LinkedTo":df['NAME'].iloc[1:],"To_Id":df['ID'].iloc[1:]})

但我在添加组ID时遇到问题。当我做以下

pd.DataFrame({"LinkedBy": df['NAME'].iloc[0],"By_Id": df['ID'].iloc[0],"LinkedTo":df['NAME'].iloc[1:],"To_Id":df['ID'].iloc[1:],"GroupId":df['potential_group_id'].iloc[0]})

我得到OverflowError: long too big to convert

如何将long类型的group_id添加到我的新df中。

2 个答案:

答案 0 :(得分:1)

由于所有行中的group_id看起来都相同,您可以尝试这样做:

res = pd.merge(left=df.iloc[0,:], right=df.iloc[1:,:], how='right', on=['group_id'])
res.columns = ['By_Id', 'LinkedBy', 'group_id', 'To_Id', 'LinkedTo']

请注意,仅当group_id可用作您的加入密钥时,此功能才有效。

答案 1 :(得分:0)

  • app.post('/request', (req, res) => { const artist = req.body.artist; const searchURL = "https://api.spotify.com/v1/search? q="+artist+"&type=artist"; var targetObj; var options = { uri: searchURL }; rp(options) .then(function (data) { console.log(data); res.send(data); }) .then(function() { console.log('complete'); }) .catch(function (err) { console.log('error') }); 一切,然后groupby使用自定义功能
  • apply确保cond1匹配
  • 'group_id'确保cond2不匹配
  • 'NAME'函数
  • 中的子集df
  • applyrename内容
  • 更多重命名,删除和重置
drop

enter image description here

<强> OR

def find_grp(x):
    cond1 = df.group_id == x.name[2]
    cond2 = df.NAME != x.name[1]
    temp = df[cond1 & cond2]
    rnm = dict(ID='To_ID', NAME='LinkedTo')
    return temp.drop('group_id', axis=1).rename(columns=rnm)


cols = ['ID', 'NAME', 'group_id']
df1 = df.groupby(cols).apply(find_grp)
df1.index = df1.index.droplevel(-1)
df1.rename_axis(['By_ID', 'LinkedBy', 'group_id']).reset_index()

enter image description here