gpt4 book ai didi

python - 填充空行

转载 作者:行者123 更新时间:2023-12-02 15:47:13 26 4
gpt4 key购买 nike

我有一个大型数据集,其中一些行没有放在正确的列中。例如

数据:

#DataFrame
data = {'Status': ['Active', 'Active', 'Active', 'Active','Active', 'Active'],
'Name': ['Tom', ' ', 'krish', ' ', 'Jack', 'Lisa'],
'Email': ['test@gmail.com', ' ', 'test@gmail.com', ' ', 'test@gmail.com', 'test@gmail.com'],
'Name2': [' ', 'John', ' ', 'Tim', ' ', ' '],
'Email2':[' ', 'test@gmail.com', ' ', 'test@gmail.com', ' ', ' ']}

#Print DataFrame

df = pd.DataFrame(data)
df

在这种情况下,“姓名”和“电子邮件”列有一些空白,因为它们被放置在名为“name2”和“email2”的新列中

我想看看我是否可以用错放在不同列中的实际姓名和电子邮件来填充空白区域。

我正在尝试做一些研究,但我没有找到任何重要信息,或者我不知道这是否可行。

实际数据集:

Status  Name  Email          Name2      Email2 
Active Tom t@gmail.com
Active Tim t@gmail.com
Active Tom t@gmail.com
Active Tim t@gmail.com

预期结果

Name2   Name  Email2 
Active Tom t@gmail.com
Active Tim t@gmail.com
Active Tom t@gmail.com
Active Tom t@gmail.com

最佳答案

  • 根据底部的 timeit 比较,此选项比所有其他当前答案都快。
  • 使用 Boolean indexing 选择适当的列到单独的数据框中, 将数据帧与 .concat 结合起来, 并对索引进行排序。
    • bool 索引是矢量化的,比使用 .apply 快得多。
  • 空单元格在 OP 中使用 ' ' 指定,它在 df.Name.ne(' ') 中用于跳过具有该值的行。
    • 如果空格是np.nan,那么执行~df.Name.isna()而不是df.Name.ne(' ')
    • 如果空字符串的长度不同或不确定,则使用 df = df.replace('\\s+', '', regex=True),并更改 .ne(' ').ne('')
  • 如果
  • .copy() 不会导致 SettingwithCopyWarning(在测试过程中没有发生),则可以将其删除。
# select Status and the columns without numbers
df1 = df.loc[df.Name.ne(' '), ['Status', 'Name', 'Email']].copy()

# select Status and the columns with 2; rename the columns with 2
df2 = df.loc[df.Name2.ne(' '), ['Status', 'Name2', 'Email2']].copy().rename({'Name2': 'Name', 'Email2': 'Email'}, axis=1)

df = pd.concat([df1, df2]).sort_index()

# display(df)
Status Name Email
0 Active Tom test@gmail.com
1 Active John test@gmail.com
2 Active krish test@gmail.com
3 Active Tim test@gmail.com
4 Active Jack test@gmail.com
5 Active Lisa test@gmail.com

一行

# as a single line without creating separate objects for each set of columns
df = pd.concat([df.loc[df.Name.ne(' '), ['Status', 'Name', 'Email']],
(df.loc[df.Name2.ne(' '), ['Status', 'Name2', 'Email2']])
.rename({'Name2': 'Name', 'Email2': 'Email'}, axis=1)]).sort_index()

比较

# given df in the op, create a large dataset
df = pd.concat([df]*100000).reset_index(drop=True)


def trenton(df):
return pd.concat([df.loc[df.Name.ne(' '), ['Status', 'Name', 'Email']],
(df.loc[df.Name2.ne(' '), ['Status', 'Name2', 'Email2']])
.rename({'Name2': 'Name', 'Email2': 'Email'}, axis=1)]).sort_index()


def echo(df):
df["Name"] = (df["Name"] + df["Name2"]).str.strip()
df["Email"] = (df["Email"] + df["Email2"]).str.strip()
df = df.drop(["Name2", "Email2"], axis=1)
return df


def sierra(df):
df['Name'] = df.apply(lambda x: x[3] if x[1] == ' ' else x[1], axis=1)
df['Email'] = df.apply(lambda x: x[4] if x[2] == ' ' else x[2], axis=1)
df = df.drop(labels=['Name2', 'Email2'], axis=1)
return df


def BeRT2me(df):
df = df.applymap(str.strip)
df = df.replace('', np.nan)
df.Name = df.Name.fillna(df.Name2)
df.Email = df.Email.fillna(df.Email2)
df = df.drop(['Name2', 'Email2'], axis=1)
return df

时间

%timeit trenton(df)
[out]:
101 ms ± 604 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit echo(dftest)
[out]:
390 ms ± 13.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit sierra(df)
[out]:
6.11 s ± 64.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit BeRT2me(df)
[out]:
258 ms ± 4.28 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 填充空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73737985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com