我有一个数据框
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中。
答案 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
apply
和rename
内容drop
<强> 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()