关于python:使用pandas根据现有列值向数据框添加新列

Add a new column to a dataframe based on an existing column value using pandas

本问题已经有最佳答案,请猛点这里访问。

我正在使用通过导入创建的.csv文件创建的数据框。 我想(1)在数据框中创建一个新列,并(2)使用现有列中的值为新列分配一个值。 这是我正在使用的示例:

1
2
3
4
5
   date    id    height     gender
dd/mm/yyyy 1A      6          M
dd/mm/yyyy 2A      4          F
dd/mm/yyyy 1B      1          M
dd/mm/yyyy 2B      7          F

因此,我想创建一个新列" side",并根据现有的" id"列值使该边具有值" A"或" B":

1
2
3
4
5
   date    id    height     gender    side
dd/mm/yyyy 1A      6        M          A
dd/mm/yyyy 2A      4        F          A
dd/mm/yyyy 1B      1        M          B
dd/mm/yyyy 2B      7        F          B

我已经到了可以创建新列并分配新值的地步,但是当我尝试在"侧边"列上使用.groupby方法时,它无法按预期工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
df = pd.read_csv("clean.csv")
df = df.drop(["Unnamed: 0"], axis=1)

df["side"] =""

df.columns = ["date","id","height","gender","side"]

for i, row in df.iterrows():
    if"A" in row["id"]:
        df.at[i, row["side"]] ="A"
    else:
        df.at[i, row["side"]] ="B"

df["side"]

调用df["side"]会导致空白输出,但是单独调用df会产生以下结果:
df shows a value in the side column

因此,数据框中有一个值,但是使用.groupby方法会将边栏中的值视为不存在。 这是一个真正的骗子。 我是Python的新手,如果有人可以向我解释我在做什么错,我将不胜感激。


只需使用str[]。 我看不到图像。 如果您的id具有超过2个字符,则需要此字符来获取最后一个字符

1
2
3
4
5
6
7
8
9
df['side'] = df.id.str[-1]


Out[582]:
         date  id  height gender side
0  dd/mm/yyyy  1A       6      M    A
1  dd/mm/yyyy  2A       4      F    A
2  dd/mm/yyyy  1B       1      M    B
3  dd/mm/yyyy  2B       7      F    B


1. Series.str

1
2
3
4
5
6
7
df['id'].str[-1:]

         date  id  height gender side
0  dd/mm/yyyy  1A       6      M    A
1  dd/mm/yyyy  2A       4      F    A
2  dd/mm/yyyy  1B       1      M    B
3  dd/mm/yyyy  2B       7      F    B

或为了安全起见,更笼统。

2. str.extractregex

1
2
3
4
5
6
7
df['side'] = df['id'].str.extract('([A-Za-z])')

         date  id  height gender side
0  dd/mm/yyyy  1A       6      M    A
1  dd/mm/yyyy  2A       4      F    A
2  dd/mm/yyyy  1B       1      M    B
3  dd/mm/yyyy  2B       7      F    B

3. Str.slice

1
2
3
4
5
6
7
df['side'] = df['id'].str.slice(start=-1)

         date  id  height gender side
0  dd/mm/yyyy  1A       6      M    A
1  dd/mm/yyyy  2A       4      F    A
2  dd/mm/yyyy  1B       1      M    B
3  dd/mm/yyyy  2B       7      F    B