函数现在打印每个字母而不是每个字

时间:2017-05-22 21:29:15

标签: python pandas

我的数据如下:

owned   category                            weight  mechanics_split
28156   Environmental, Medical              2.8023  [Action Point Allowance System, Co-operative P...
9269    Card Game, Civilization, Economic   4.3073  [Action Point Allowance System, Auction/Biddin...
36707   Modern Warfare, Political, Wargame  3.5293  [Area Control / Area Influence, Campaign / Bat...

并使用此函数(taken from the generous answer in this question):

def owned_nums(games):
    for row in games.iterrows():
        owned_value = row[1]['owned']
        mechanics =  row[1]['mechanics_split']
        for type_string in mechanics:
            game_types.loc[type_string, ['owned']] += owned_value

迭代数据框中的值,并将新值放入名为game_types的新数据框中。它运作得很好。事实上,它仍然很好;该笔记本已打开,如果我将该函数的最后一行更改为print (type_string),则会打印:

Action Point Allowance System
Co-operative Play
Hand Management
Point to Point Movement
Set Collection
Trading
Variable Player Powers
Action Point Allowance System...

好的,完美的。因此,我将数据保存为csv,打开一个新笔记本,打开带有拆分字符串的列的csv,复制并粘贴完全相同的功能,当我打印type_string时,我现在得到:

[
'
A
c
t
i
o
n

P
o
i
n
t

A
l
l
o
w

我唯一注意到的是原始列表是无引号的,[Action Point Allowance System, Co-operative...]等等,而从新csv打开的新数据框被呈现为['Action Point Allowance System', 'Co-operative...'],带引号。我使用str.replace("'","")删除了引号,但它仍然返回每个字母。我试过尝试to_csv中的escapechars,但无济于事。关于我需要调整什么设置非常困惑。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

代码的唯一方法

    mechanics =  row[1]['mechanics_split']
    for type_string in mechanics:
        game_types.loc[type_string, ['owned']] += owned_value
如果你的mechanics_split列不包含字符串而是包含字符串的iterable,那么

可以有效。

在系列中存储非标量数据并不是很好的支持,虽然它有时很有用(虽然很慢)作为中间步骤,但它不应该是你经常做的事情。基本上你正在做的是

>>> df = pd.DataFrame({"A": [["x","y"],["z"]]})
>>> df.to_csv("a.csv")
>>> !cat a.csv
,A
0,"['x', 'y']"
1,['z']

之后你有

>>> df2 = pd.read_csv("a.csv", index_col=0)
>>> df2
            A
0  ['x', 'y']
1       ['z']
>>> df.A.values
array([['x', 'y'], ['z']], dtype=object)
>>> df2.A.values
array(["['x', 'y']", "['z']"], dtype=object)
>>> type(df.A.iloc[0])
<class 'list'>
>>> type(df2.A.iloc[0])
<class 'str'>

你注意到最初包含字符串列表的系列现在是一个只包含字符串的系列。如果你考虑一下这是有意义的,因为CSVs从未声称是保留类型的。

如果你坚持使用这样的框架,你应该在阅读和写作时通过一些表示(例如JSON字符串)手动编码和解码你的列表。我太懒了,无法确认大熊猫对str-ify列表的作用,但是你可以通过apply ast.literal_evaluint8_t转换为生成的字符串,将它们转回列表。< / p>