简短版:我需要遍历条件数据框以使用一列开始值,结束值和分配值来分配值。第二个数据框拥有我需要在列中分配“赋值”的值。
以下是我正在尝试做的简化版本。我正在使用从导入的CSV创建的两个单独的数据框。一个导入的CSV文件具有“开始”,“结束”和“分配”类别。第二个包含我需要分配值的实际值列表,我也需要分配类别。总的来说,我知道这似乎很奇怪,但这是我获取数据的方式,并且需要大量时间手动处理excel和给出的大量列表上单独类别的标签。
为了方便起见,我创建了与索引号匹配的值名称,但是在我的真实文件中,这些名称与索引号不匹配。
这是带有我的开始,结束和分配值的标准数据框
Start End Category
1 15 Dog
16 19 Rabbit
20 23 Bat
这就是我要处理的当前数据框的样子
Items
Item 1
Item 2
Item 3
Item 4
Item 5
.
.
.
Item 16
Item 17
Item 18
Item 19
Item 20
Item 21
Item 22
这就是我希望数据框成为
Items New Column
Item 1 Dog
Item 2 Dog
Item 3 Dog
Item 4 Dog
Item 5 Dog
.
.
.
Item 16 Rabbit
Item 17 Rabbit
Item 18 Rabbit
Item 19 Rabbit
Item 20 Bat
Item 21 Bat
Item 22 Bat
解决问题的一种方法是将新值应用于,New Column
同时在由Start
和End
为每个行值创建的范围内过滤第一个数据框,例如以下示例:
import pandas as pd
def assign_value(row, df):
index = int(row['Items'].replace('Item ', ''))
# Check if index is in the df start ranges
_df = df.loc[[index in elm for elm in df['Range'].values]]
if not _df.empty:
return _df.iloc[0]['Category']
return None
start_rows = [(1, 15, 'Dog'), (16, 19, 'Rabbit'), (20, 23, 'Bat')]
df_start = pd.DataFrame(start_rows, columns=['Start', 'End', 'Category'])
# Create a new column with a range from start to end + 1
df_start['Range'] = df_start.apply(lambda row: range(row['Start'], row['End'] + 1), axis=1)
df = pd.DataFrame([f'Item {elm}' for elm in range(1, 23)], columns=['Items'])
df['New Column'] = df.apply(lambda row: assign_value(row, df_start), axis=1)
print(df)
输出:
Items New Column
0 Item 1 Dog
1 Item 2 Dog
2 Item 3 Dog
3 Item 4 Dog
4 Item 5 Dog
5 Item 6 Dog
6 Item 7 Dog
7 Item 8 Dog
8 Item 9 Dog
9 Item 10 Dog
10 Item 11 Dog
11 Item 12 Dog
12 Item 13 Dog
13 Item 14 Dog
14 Item 15 Dog
15 Item 16 Rabbit
16 Item 17 Rabbit
17 Item 18 Rabbit
18 Item 19 Rabbit
19 Item 20 Bat
20 Item 21 Bat
21 Item 22 Bat
或者,您可以简单地(如果您的起始数据帧很小)可以使用此分配函数:
def assign_value(row, df):
for _, elm in df.iterrows():
index = int(row['Items'].replace('Item ', ''))
if index in range(elm['Start'], elm['End'] + 1):
return elm['Category']
return None
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句