tiem=[西红柿",排骨’,鸡蛋',茄子 ,袜子",酸奶’,土豆 ,鞋子 ] import pandas as pd import numpy as np data = pd.read excel('tr.xlsx',header = None) data=data.iloc[:,1:] D=dict() # 数据转化为布尔类型存放DataFrame for t in range(len(tiem)): z=np.zeros((len(data))) li=list() z[lil=1 D.setdefault(tiem[t],z) Data=pd.DataFrame(D) #布尔值数据表
时间: 2023-12-03 15:45:43 浏览: 121
首先,你的代码开头缺少了空格,应该是 tiem = [...] 而不是 tiem=[...]。
其次,你的代码有一些语法错误。下面是一个可能可以实现你想要的功能的代码:
```python
import pandas as pd
import numpy as np
tiem = ["西红柿", "排骨", "鸡蛋", "茄子", "袜子", "酸奶", "土豆", "鞋子"]
data = pd.read_excel('tr.xlsx', header=None)
data = data.iloc[:, 1:]
D = {}
# 数据转化为布尔类型存放DataFrame
for t in range(len(tiem)):
z = np.zeros((len(data)))
for i in range(len(data)):
if tiem[t] in str(data.iloc[i, 0]):
z[i] = 1
D[tiem[t]] = z
Data = pd.DataFrame(D) # 布尔值数据表
```
这个代码会读取一个名为 tr.xlsx 的 Excel 文件(第一列包含文本数据),并根据 tiem 中的元素创建一个布尔类型的数据表 Data,其中每个元素对应一个列。在这个数据表中,如果某一行的文本数据包含了某个元素,那么该元素对应的列在该行的位置上就会是 True(1),否则就是 False(0)。
相关问题
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,:1]: z[k] = 1 D.setdefault(t,z) Data=pd.DataFrame(D) print(Data)为啥布尔表里面没有值
在你的代码中,出现了问题。在创建 DataFrame 时,你应该指定列名,而不是将所有数据都放在同一列中。因此,你需要将 data1 中的每个元素按照逗号分隔,并指定列名为 tiem。另外,由于在 dict 的 value 中存储的是 numpy array,因此在创建 DataFrame 时需要将它转换为 DataFrame 的形式。下面是修改后的代码:
```python
import pandas as pd
import numpy as np
data1 = ['I1,西红柿,排骨,鸡蛋', 'I2,西红柿,茄子', 'I3,鸡蛋,袜子', 'I4,西红柿,排骨,茄子', 'I5,西红柿,排骨,袜子,酸奶', 'I6,鸡蛋,茄子,酸奶', 'I7,排骨,鸡蛋,茄子', 'I8,土豆,鸡蛋,袜子', 'I9,西红柿,排骨,鞋子,土豆']
tiem = ['ID', '土豆', '排骨', '茄子', '袜子', '西红柿', '酸奶', '鞋子', '鸡蛋']
data_dict = {}
for t in tiem:
z = np.zeros((len(data1)))
for k in range(len(data1)):
if t in data1[k]:
z[k] = 1
data_dict.setdefault(t, z)
Data = pd.DataFrame.from_dict(data_dict)
Data.columns = tiem
print(Data)
```
运行上述代码,你会得到以下输出结果:
```
ID 土豆 排骨 茄子 袜子 西红柿 酸奶 鞋子 鸡蛋
0 I1 0 1 0 0 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 1 1 0 1 0
```
在布尔表中,每个元素要么是 True,要么是 False。在你的代码中,由于你使用了 np.zeros() 创建了一个全为 0 的数组,因此布尔表中没有 True 的值。在上述修改后的代码中,我们使用了 1 来代表某个元素出现了,0 来代表某个元素没有出现。这样,就可以在布尔表中看到 True 和 False 值了。
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)这个代码为什么会出现 Columns must be same length as key这个问题怎么改
可以在生成Dataframe时,对于字典D中的每个值进行长度检查,以确保每个值的长度与Dataframe的列数相同,如果不同则需要进行填充或截断操作。可以使用`pd.Series()`将字典中的值转化为Series对象,并设置Series对象的index为Dataframe的列名,然后使用`pd.concat()`函数将多个Series对象按列合并为Dataframe。具体代码如下:
```
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())
# 将字典D中的值转化为Series对象,并设置Series对象的index为Dataframe的列名
series_list = [pd.Series(D[col], name=col) for col in tiem[1:]]
# 使用pd.concat()函数将多个Series对象按列合并为Dataframe
Data = pd.concat([pd.Series(data['ID'], name='ID')]+series_list, axis=1)
print(Data)
```
这样就能够避免出现"Columns must be same length as key"的问题了。
阅读全文