将数百列和列索引合并为一个字符串

2024-04-27 03:19:21 发布

您现在位置:Python中文网/ 问答频道 /正文

对于我关于堆栈溢出的第一个问题,我希望这是一个独特/有趣的问题!你知道吗

我有技能评估的数据,目前在一个非常大的数据框架中。每一行代表一个学生,每一列包含他们在特定技能评估中的得分。总共有大约200个技能评估,每个学生只有一个分数在这些评估的一小部分(1-20分是典型的,但有些学生有更多)。你知道吗

数据帧结构示例:

id    skill1  skill2  skill3  skill4  skill5 ....
1     10      50      NaN     3       NaN
2     Nan     10      2       70      NaN
3     23      NaN     45      NaN     5

我正在尝试将这些数据转换为每个学生的空格分隔字符串,格式如下,以便我们可以将其导入不同的数据存储:

skill1:10 skill2:50 skill4:3
skill2:10 skill3:2 skill4:70

(请注意,没有评估分数的技能不会添加到列表中)

我创建了一个lambda函数,将所有这些技能值与其列标签连接起来:

skillmerge = lambda row: ' '.join([str(row.index[i])+':'+str(row[i]) for i in range(0,len(row)) if row[i]!=np.nan])

当我创建一个要测试的系列(1个学生)时,lambda函数用不到一秒钟的时间创建所需格式的输出字符串。但是,当我创建一个只有2行的数据帧时(同样是出于测试目的),该函数只需要几分钟就可以完成这2行:

testing_df['combined_skills'] = testing_df.apply(skillmerge, axis=1)

鉴于我在这个数据集中有几百万学生,我正在寻找一种方法,使这个过程可靠地工作得更快。你有没有想过我可以在哪里解决这个问题?你知道吗

提前谢谢你帮我回答我的第一个问题!:D个


Tags: 数据lambda函数字符串格式技能nan学生
2条回答

使用to_json然后修复它

def to_str(x):
    return x.dropna().to_json(double_precision=0) \
            .replace('"', '').replace(',', ' ').strip("{}")

df.T.apply(to_str)

或者使用列表理解和join

def to_str(x):
    return " ".join(["{}:{}".format(k, int(v)) for k, v in x.dropna().iteritems()])

df.T.apply(to_str)

两者都给予

id
1    skill1:10 skill2:50 skill4:3
2    skill2:10 skill3:2 skill4:70
3    skill1:23 skill3:45 skill5:5
dtype: object

使您的解决方案有效

skillmerge = lambda row: ' '.join([str(row.index[i])+':'+str(row[i]) for i in range(len(row)) if not np.isnan(row[i])])

df.T.apply(skillmerge)

注意,np.nan == np.nan的计算结果是False。为了测试np.nan,使用np.isnanpd.isnullpd.notnull。这个事实使你的解决方案落空了。我用not np.isnan替换了它,它就工作了。你知道吗

我抓住机会做我想做的事,因为我更喜欢它。你知道吗

试试这个:

ld = df.set_index('id').fillna("").to_dict(orient='records')
ll = [' '.join([ k +":"+ str(v) for k,v in x.iteritems() if v != "" ]) for x in ld ]
ll 

 ['skill2:50.0 skill1:10.0 skill4:3.0',
 'skill3:2.0 skill2:10.0 skill4:70.0',
 'skill3:45.0 skill1:23.0 skill5:5.0']

相关问题 更多 >