将pandas数据框列表转换为布尔列

3

我在尝试使用.isin()时遇到了一些意外的错误。

问题是这样的。我已经从网站上抓取了数据,并将其转换为数据框。现在我想对数据进行更改,以使其更适合项目使用。

从抓取的数据中,有一列包含所有的特征,它是一个json格式的列表,但在pd中,它是一个非空对象

"feature": ["Wi-Fi", "LAN", "LED"]

我希望基于每个特征创建新的布尔列,这将在未来非常有用。 它应该像这样:

Product    Wifi    LAN   LED
1          True    True  True
2          True    False False

我尝试了 str.contains.isin(),但是只得到了错误。例如

TypeError: only list-like objects are allowed to be passed to isin(), you passed a [str]
ValueError: Length of values does not match length of index

如何更好地解决这个问题?

另外,原始数据是用日语编写的,我使用"encoding="utf-8"将数据加载到数据框中。当在pandas中使用utf8时,最佳编码方法是什么?我正在使用Notepad++作为编辑器。


你能提供一个小的可重现的输入数据集样本吗?feature是什么 - 它是一个JSON字符串还是一个特征列表? - MaxU - stand with Ukraine
请点击编辑并将数据集示例放入您的问题中 - 作为评论,它几乎无法阅读。 - MaxU - stand with Ukraine
{"name": "CHEZ MADU ", "address": "5-17-62", "access": "30", "tel": "042-465-3533", "hour": "9:00〜22:00", "offday": "-", "web": "http://www.hakka-group.co.jp/shoplist/", "feature": ["Wi-Fi", "LAN", "Non-smoking"]}, 这是一行原始数据。 - DatCra
1个回答

4

如果需要检查值是否在列表中,请使用applyin一起使用:

df = pd.read_json('sample.json', lines=True, encoding="utf-8")
print (df)
   access  address                     feature        hour        name offday  \
0      30  5-17-62  [Wi-Fi, LAN1, Non-smoking]  9:0022:00  CHEZ MADU       -   
1      30  5-17-62  [Wi-Fi, LAN2, Non-smoking]  9:0022:00  CHEZ MADU       -   
2      30  5-17-62  [Wi-Fi, LAN3, Non-smoking]  9:0022:00  CHEZ MADU       -   

            tel                                     web  
0  042-465-3533  http://www.hakka-group.co.jp/shoplist/  
1  042-465-3533  http://www.hakka-group.co.jp/shoplist/  
2  042-465-3533  http://www.hakka-group.co.jp/shoplist/  

mask = df['feature'].apply(lambda x: 'LAN1' in x)
print (mask)
0     True
1    False
2    False
Name: feature, dtype: bool

类型错误:JSON对象必须是str、bytes或bytearray,而不是'list'。这是从json.loads得到的。 df = pd.read_json('test.json', encoding="utf-8") 这个有可能与问题有关吗? - DatCra
好的,请问您的问题列 df.loc[0, 'col'] 的输出是什么类型? - jezrael
<class 'list'> - DatCra
好的,也许需要通过 mask = df['col'].apply(lambda x: 'LAN' in x) 检查列表中的一些项目。 - jezrael
它正在工作!我使用df['LAN'] = mask将其添加为新列。有更好的方法吗? - DatCra
我认为 df['LAN'] = df['col'].apply(lambda x: 'LAN' in x),但是它是相同的。 - jezrael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接