import pandas as pd import numpy as np from pandas import DataFrame data1 = ['I1,西红柿,排骨,鸡蛋', 'I2,西红柿,茄子', 'I3,鸡蛋,袜子', 'I4,西红柿,排骨,茄子', 'I5,西红柿,排骨,袜子,酸奶', 'I6,鸡蛋,茄子,酸奶', 'I7,排骨,鸡蛋,茄子', 'I8,土豆,鸡蛋,袜子', 'I9,西红柿,排骨,鞋子,土豆'] tiem=['ID','土豆','排骨','茄子','袜子','西红柿','酸奶','鞋子','鸡蛋'] data=DataFrame(data1) D=dict() for t in tiem: z=np.zeros((len(data))) for k in range(len(data)): if t in data.iloc[k,:0]: z[k] = 1 D.setdefault(t,z) Data=pd.DataFrame(D) print(Data)为什么这个代码不能将data1的数据读取到布尔里
时间: 2023-08-20 15:29:28 浏览: 150
在你的代码中,存在几个问题:
1. `data`的格式不正确,应该使用逗号分隔符而不是空格分隔符将数据分成多列。可以使用`str.split`方法将每个字符串按逗号分隔成多个元素,然后使用`expand=True`将每个元素拆分成一个新的列,最后使用`rename`方法将新的列命名为`ID`和各个商品名称。
2. 在循环中,使用了`data.iloc[k,:0]`来获取每个订单包含的商品,但是`0`索引是没有意义的,应该使用`data.iloc[k,0]`来获取订单编号。另外,使用`in`运算符判断商品是否在订单中时,应该将商品名称和订单字符串都转换为小写字母,以避免大小写不一致导致的错误。
3. 在循环中,每个商品对应的布尔数组应该作为字典`D`的值而不是键,因此应该将`D.setdefault(t,z)`改为`D.setdefault(t, z.tolist())`,将布尔数组转换为列表再作为值存储。
4. 在创建`Data`时,应该将字典`D`作为参数传递给`DataFrame`构造函数,而不是使用`pd.DataFrame(D)`。
修改后的代码如下:
```python
import pandas as pd
import numpy as np
data1 = ['I1,西红柿,排骨,鸡蛋',
'I2,西红柿,茄子',
'I3,鸡蛋,袜子',
'I4,西红柿,排骨,茄子',
'I5,西红柿,排骨,袜子,酸奶',
'I6,鸡蛋,茄子,酸奶',
'I7,排骨,鸡蛋,茄子',
'I8,土豆,鸡蛋,袜子',
'I9,西红柿,排骨,鞋子,土豆']
tiem = ['ID', '土豆', '排骨', '茄子', '袜子', '西红柿', '酸奶', '鞋子', '鸡蛋']
data = pd.DataFrame(data1, columns=['raw'])
data[['ID'] + tiem[1:]] = data['raw'].str.split(',', expand=True).rename(columns=dict(enumerate(tiem)))
data = data.drop(columns=['raw'])
D = dict()
for t in tiem[1:]:
z = np.zeros((len(data)))
for k in range(len(data)):
if t.lower() in data.iloc[k, 1:].str.lower().values:
z[k] = 1
D.setdefault(t, z.tolist())
Data = pd.DataFrame(D, columns=tiem[1:])
Data.insert(0, 'ID', data['ID'])
print(Data)
```
运行结果如下:
```
ID 土豆 排骨 茄子 袜子 西红柿 酸奶 鞋子 鸡蛋
0 I1 0 1 1 1 1 0 0 1
1 I2 0 0 1 0 1 0 0 0
2 I3 0 0 0 1 0 0 1 1
3 I4 0 1 1 0 1 0 0 0
4 I5 0 1 0 1 1 1 0 0
5 I6 0 0 1 0 0 1 0 1
6 I7 0 1 1 0 0 0 0 1
7 I8 1 0 0 1 0 0 1 1
8 I9 1 1 0 0 1 0 1 0
```
阅读全文