Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 以熊猫为单位将元组中的字符串拆分为列_Python_Pandas_Split - Fatal编程技术网

Python 以熊猫为单位将元组中的字符串拆分为列

Python 以熊猫为单位将元组中的字符串拆分为列,python,pandas,split,Python,Pandas,Split,我有以下DataFrame,其中Track ID是行索引。如何将stats列中的字符串拆分为5列数字 Track ID stats 14.0 (-0.00924175824176, 0.41, -0.742016492568, 0.0036830094242, 0.00251748449963) 28.0 (0.0411538461538, 0.318230769231, 0.758717081514, 0.00264000622468, 0.0106535783677) 42

我有以下
DataFrame
,其中
Track ID
是行索引。如何将
stats
列中的字符串拆分为5列数字

Track ID    stats
14.0    (-0.00924175824176, 0.41, -0.742016492568, 0.0036830094242, 0.00251748449963)
28.0    (0.0411538461538, 0.318230769231, 0.758717081514, 0.00264000622468, 0.0106535783677)
42.0    (-0.0144351648352, 0.168438461538, -0.80870348637, 0.000816872566404, 0.00316572586742)
56.0    (0.0343461538462, 0.288730769231, 0.950844962874, 6.1608706775e-07, 0.00337262030771)
70.0    (0.00905164835165, 0.151030769231, 0.670257006716, 0.0121790506745, 0.00302182567957)
84.0    (-0.0047967032967, 0.171615384615, -0.552879463981, 0.0500316517755, 0.00217970256969)

假设您有一个包含元组(如示例中所示)而不是字符串的列,这将起作用:

df = pandas.DataFrame({'Track ID': [14, 28, 42], 'stats': [(1, 2, 3, 4, 5), (1, 2, 3, 4, 5), (1, 2, 3, 4, 5)]}).set_index("Track ID")

from operator import itemgetter
for i in range(5):
    df["Col {}".format(i)] = df.stats.apply(itemgetter(i))
如果您实际拥有看起来像元组的字符串,则可以首先解析它们,然后应用与上面相同的模式:

df = df2 = pandas.DataFrame({'Track ID': [14, 28, 42], 'stats': ["(1, 2, 3, 4, 5)", "(1, 2, 3, 4, 5)", "(1, 2, 3, 4, 5)"]}).set_index("Track ID")
df.stats = df2.stats.str.strip("()").str.split(", ")

对于另一种情况,假设它是看起来像元组的字符串:

In [74]: df['stats'].str[1:-1].str.split(',', expand=True).astype(float)
Out[74]:
          0         1         2         3         4
0 -0.009242  0.410000 -0.742016  0.003683  0.002517
1  0.041154  0.318231  0.758717  0.002640  0.010654
2 -0.014435  0.168438 -0.808703  0.000817  0.003166
3  0.034346  0.288731  0.950845  0.000001  0.003373
4  0.009052  0.151031  0.670257  0.012179  0.003022
5 -0.004797  0.171615 -0.552879  0.050032  0.002180
(注意:对于较旧版本的pandas(<0.16.1),需要使用
return\u type='frame'
而不是expand关键字)

顺便说一下,如果它是元组而不是字符串,您可以简单地执行以下操作:

pd.DataFrame(df['stats'].tolist(), index=df.index)

如果您有一个元组序列而不是字符串序列,并且希望将它们作为数据帧列,那么这是最简单的方法:

df = pd.concat([df['Track ID'],pd.DataFrame(df['stats'].values.tolist())], axis=1)
如果它实际上是字符串,则可以先将其转换为类似的列表,然后应用上述操作:

dfpart = pd.DataFrame(df['stats'].apply(lambda x: x.strip('()').split(', ')).values.tolist()).astype(float)
df = pd.concat([df['Track ID'], dfpart], axis=1)

因为您的stats列包含长度为5的元组,所以这项工作相当简洁

pd.concat([df['Track ID'], pd.DataFrame(df['stats'].tolist(), index = 
df.index, columns = [f'stats_{i}' for i in range(1, 6)])], axis = 1)

通过发布数据帧的df.to_dict()而不是它的字符串表示形式,您将使其他人的事情变得更容易。stats列,它是否包含看起来像元组的字符串,还是包含元组?可能重复感谢您的输入-我非常处于陡峭学习曲线的底部。我不知道
df.to_dict()
,但它告诉我数据中的
stats
列实际上是元组,而不是字符串。例如,在df['stats']]中对x使用
[float(x[0])得到了第0个元素。感谢您的输入。我对panda、python和脚本一般来说都是新手,所以我仍在学习基础知识。
stats
列中的数据实际上是元组。使用
df2=df['stats'].apply(pd.Series)
创建一个新的数据帧让我向前迈进了一大步。再次感谢。
return\u type
已被弃用,取而代之的是
expand=True
。请不要使用
apply(pd.Series)
(或推荐其用法)。请看,更好的解决方案是首先列出列。