2017-08-01 282 views
3

我意识到我的标题的措辞并不是最好的,但我希望一个例子会清楚这起来了。将“字符串”和“数字串”的列表转换为“数字串”被转换为数字的列表

我将如何转换像

example_list = ["asdf" , "4", "asdfasdf" , "8" , "9" ,"asdf"] 

清单,清单似

converted_list = ["asdf" , 4, "asdfasdf", 8 , 9 , "asdf"] 

所以基本上我怎么做在那里可以转换为整数的字符串转换为整数的列表,而无法转换的字符串仍然是字符串?

请注意,如果converted_list中的每个项目都是整数或不是整数,我将如何在for循环中进行测试?

此问题的上下文是,我试图在大熊猫中将头转换为整数,因为所有整数都是字符串。然后,如果该列的首字母为数字,我会列出该列的平均值。现在,我已将所有标题都列入列表中。

回答

6

您可以使用带三元的列表理解来确定列表中的每个元素是否为数字。

>>> [int(n) if n.isdigit() else n for n in example_list] 
['asdf', 4, 'asdfasdf', 8, 9, 'asdf'] 
+1

我以前形成字典的笨拙方式。但是你可以在你的字典理解中使用你的洞察力,以便在'重新命名'调用中使用。 'df.rename(columns = {k:int(k)for k in df.columns if k.isdigit()})'。我很可能会开始使用这个( - : – piRSquared

+0

感谢有用的答案 是有一个原因 data_frame_names =名单(df.columns.values) #PRINT(data_frame_names) 数字化= [INT(N)如果n .isdigit()在数字化用于data_frame_names n]的 #PRINT(数字化) 别的n,用于X: 如果isinstance(X,INT): 打印(DF [df.columns [X]]意味着()。) else: pass 一直给出这个错误TypeError:必须是str,而不是int – Matthew

+0

您是否首先重命名了您的列?请参阅上面的@piRSquared的注释请注意,您需要重新分配结果,例如'df = df.rename ...)'。 – Alexander

2

设置

example_list = ["asdf" , "4", "asdfasdf" , "8" , "9" ,"asdf"] 

df = pd.DataFrame(np.arange(24).reshape(4, 6), columns=example_list) 

df 

    asdf 4 asdfasdf 8 9 asdf 
0  0 1   2 3 4  5 
1  6 7   8 9 10 11 
2 12 13  14 15 16 17 
3 18 19  20 21 22 23 

转换头

df.rename(columns={k: int(k) for k in df.columns[df.columns.str.isdigit()]}) 

    asdf 4 asdfasdf 8 9 asdf 
0  0 1   2 3 4  5 
1  6 7   8 9 10 11 
2 12 13  14 15 16 17 
3 18 19  20 21 22 23 

注意
@亚历山大在列表理解中使用字符串方法isdigit是非常有用的。我们可以通过与他的结合来改善这个问题。

df.rename(columns={k: int(k) for k in df.columns if k.isdigit()}) 

看类型

df.rename(
    columns={k: int(k) for k in df.columns[df.columns.str.isdigit()]} 
).columns.map(type) 

Index([<class 'str'>, <class 'int'>, <class 'str'>, <class 'int'>, 
     <class 'int'>, <class 'str'>], 
     dtype='object') 
+0

OP说 - '我想转换头在pandas' - 所以mybe名单是列名:) – jezrael

+1

THX @jezrael 。我已经更新了一些答案。 – piRSquared