【问题标题】:Turn pandas dataframe list into boolean column将 pandas 数据框列表转换为布尔列
【发布时间】:2023-03-21 00:34:01
【问题描述】:

我在尝试 .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 字符串 还是功能列表?
  • 请按edit 并将数据集样本放入您的问题 - 作为评论很难阅读
  • {"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"]},这是一行原始数据

标签: python pandas


【解决方案1】:

如果需要检查list 中的值,请使用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:00〜22:00  CHEZ MADU       -   
1      30  5-17-62  [Wi-Fi, LAN2, Non-smoking]  9:00〜22:00  CHEZ MADU       -   
2      30  5-17-62  [Wi-Fi, LAN3, Non-smoking]  9:00〜22: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

【讨论】:

  • TypeError: the JSON object must be str, bytes or bytearray, not 'list' 从 json.loads 得到这个。 df = pd.read_json('test.json', encoding="utf-8")这和问题有关系吗?
  • 好的,您有问题的专栏的print (type(df.loc[0, 'col'])) 是什么?
  • <class 'list'>
  • 好的,所以可能需要检查mask = df['col'].apply(lambda x: 'LAN' in x)列表中的某些项目
  • 它正在工作!我使用 df['LAN'] = mask 将其添加为新列。有没有更好的办法?
猜你喜欢
  • 2013-09-15
  • 2020-04-01
  • 2017-06-22
  • 2021-03-22
  • 2020-09-02
  • 2021-01-22
  • 2021-02-09
  • 2018-03-25
相关资源
最近更新 更多