私信  •  关注

Datanovice

Datanovice 最近创建的主题
Datanovice 最近回复了
5 年前
回复了 Datanovice 创建的主题 » 在Python中将行值包含特定字符串移动到新列

使用 str.contains 具有 np.where

df['stat1'] = np.where(df['Stats'].str.contains('won|acc|suc',case=False),df['Stats'],'')
df['Stats'] = np.where(df['Stats'].str.contains('won|acc|suc',case=False),'',df['Stats'])


print(df)

         Stats  Value             stat1
0    Def duels    5.0                  
1                 2.5     Def duels Won
2  Back passes   60.0                  
3                55.0  Back passes[Acc]
4     Dribbles    5.0                  
5                 2.0     Dribbles[Suc]
5 年前
回复了 Datanovice 创建的主题 » python-将数据帧追加到sqlite3表中,是BLOB而不是timestamp?

如果你能使用 sqlalchemy 那么你就可以利用 .types

例如:

from sqlalchemy.types import INTEGER, NVARCHAR, DATETIME
# on the assumption you have 3 columns, col_str, col_int, col_date
data_types_dict = {'col_str' : NVARCHAR,
                   'col_int' : INTEGER,
                   'col_date' : DATETIME}
# assuming you have your connection defined as engine
df.to_sql(con=engine,dtypes=data_types_dict,index=False,schema='dim',if_exists='append')

print(data_types_dict)
{'col_str': <class 'sqlalchemy.sql.sqltypes.NVARCHAR'>, 
'col_int': <class 'sqlalchemy.sql.sqltypes.INTEGER'>, 
'col_date': <class 'sqlalchemy.sql.sqltypes.DATETIME'>}

在此处阅读有关SQL Alchemy&SQL lite的更多信息: https://docs.sqlalchemy.org/en/13/dialects/sqlite.html

我个人只使用过postgres和sql server,但从文档来看,它看起来像v.similair。

我们可以将值聚合到一个列表中,然后将其传递到字典中以创建新的数据帧。

new_df = pd.DataFrame(df.groupby("Stat")["Value"].agg(list).to_dict())
# your column order.
cols = df['Stat'].unique()

print(new_df[cols])
      name loca IDnu
0   cobras   DC    2
1  pythons   LA    1
6 年前
回复了 Datanovice 创建的主题 » 使用python消除excel中的重复/重复现象

这并不是说你只是在一个列中用空格填充重复的键,我会处理如下:

通过创建一个掩码,如果行是=上面的行,则返回一个true/false布尔值。

假设您的数据帧名为df

mask = df['NAME'].ne(df['NAME'].shift())

df.loc[~mask,'NAME'] = ''

说明:

我们在上面所做的是:

首先选择一个列,或者用pandas术语a系列,然后应用 .ne (不等于)实际上是 !=

让我们看看这一点。

import pandas as pd
import numpy as np
# create data for dataframe
names = ['Rekha', 'Rekha','Jaya','Jaya','Sushma','Nita','Nita','Nita']
defaults = ['','','c-default','','','c-default','','']
classes = ['forth','third','foruth','fifth','fourth','third','fifth','fourth']

现在,让我们创建一个类似于您的数据帧。

df = pd.DataFrame({'NAME' : names,
         'DEFAULT' : defaults,
         'CLASS' : classes,
         'AGE' : [np.random.randint(1,5) for len in names], 
         'GROUP' : [np.random.randint(1,5) for len in names]}) # being lazy with your age and group variables. 

所以,如果是的话 df['NAME'].ne('Omar') 这和 [df['NAME'] != 'Omar'] 我们会得到的。

0    True
1    True
2    True
3    True
4    True
5    True
6    True
7    True

所以,我们想看看第1行中的名称(记住python是一种0索引语言,所以第1行实际上是第2个物理行)是否 .eq 到上面那一排。

我们通过打电话 [.shift][2] 超链接以获取更多信息。

它的基本功能是用定义的变量号按索引移动行,我们称之为n。

如果我们打电话 df['NAME'].shift(1)

0       NaN
1     Rekha
2     Rekha
3      Jaya
4      Jaya
5    Sushma
6      Nita
7      Nita

我们可以看到雷卡已经下楼了

把这些放在一起,

df['NAME'].ne(df['NAME'].shift())
0     True
1    False
2     True
3    False
4     True
5     True
6    False
7    False

我们把这个赋值给一个自定义变量 mask 你想怎么叫都行。

然后我们用 [.loc][2] 它允许您通过标签或布尔数组(在本例中为数组)访问数据帧。

但是,我们只想访问错误的布尔值,所以我们使用 ~ 它颠倒了我们数组的逻辑。

    NAME    DEFAULT CLASS   AGE GROUP
1   Rekha       third   1   4
3   Jaya        fifth   1   1
6   Nita        fifth   1   2
7   Nita        fourth  1   4

我们现在要做的就是将这些行改为空白,作为您的初始要求,剩下的就是了。

    NAME    DEFAULT   CLASS AGE GROUP
0   Rekha             forth 2   2
1                     third 1   4
2   Jaya    c-default forth 3   3
3                     fifth 1   1
4   Sushma            fourth3   1
5   Nita    c-default third 4   2
6                     fifth 1   2
7                     fourth1   4

希望能有帮助!