Вы можете использовать str.extract
с fillna
, последним столбцом падения B
на drop
:
df[['C','D']] = df['B'].str.extract('(.*)>`(.*)', expand=True)
df['D'] = df['D'].fillna(df['B'])
df['C'] = df['C'].fillna('')
df = df.drop('B', axis=1)
print df
A C D
0 a Y abcd
1 b abcd
2 c efgh
3 d Y efgh
Следующее решение использует str.split
с mask
и numpy.where
:
df[['C','D']] = df['B'].str.split('>`', expand=True)
mask = pd.notnull(df['D'])
df['D'] = df['D'].fillna(df['C'])
df['C'] = np.where(mask, df['C'], '')
df = df.drop('B', axis=1)
Сроки:
В больших DataFrame
решениях extract
100
раз быстрее, в малых 1.5
раз:
len(df)=4
:
In [438]: %timeit a(df)
100 loops, best of 3: 2.96 ms per loop
In [439]: %timeit b(df1)
1000 loops, best of 3: 1.86 ms per loop
In [440]: %timeit c(df2)
The slowest run took 4.44 times longer than the fastest. This could mean that an intermediate result is being cached
1000 loops, best of 3: 1.89 ms per loop
In [441]: %timeit d(df3)
The slowest run took 4.62 times longer than the fastest. This could mean that an intermediate result is being cached
1000 loops, best of 3: 1.82 ms per loop
len(df)=4k
:
In [443]: %timeit a(df)
1 loops, best of 3: 799 ms per loop
In [444]: %timeit b(df1)
The slowest run took 4.19 times longer than the fastest. This could mean that an intermediate result is being cached
100 loops, best of 3: 7.37 ms per loop
In [445]: %timeit c(df2)
1 loops, best of 3: 552 ms per loop
In [446]: %timeit d(df3)
100 loops, best of 3: 9.55 ms per loop
Код:
import pandas as pd
df = pd.DataFrame({
'A' : ['a', 'b','c', 'd'],
'B' : ['Y>`abcd', 'abcd','efgh', 'Y>`efgh']
})
#for test 4k
df = pd.concat([df]*1000).reset_index(drop=True)
df1,df2,df3 = df.copy(),df.copy(),df.copy()
def b(df):
df[['C','D']] = df['B'].str.extract('(.*)>`(.*)', expand=True)
df['D'] = df['D'].fillna(df['B'])
df['C'] = df['C'].fillna('')
df = df.drop('B', axis=1)
return df
def a(df):
df = pd.concat([df, df.B.str.split('>').apply(
lambda l: pd.Series({'C': l[0], 'D': l[1][1: ]}) if len(l) == 2 else \
pd.Series({'C': '', 'D': l[0]}))], axis=1)
del df['B']
return df
def c(df):
df[['C','D']] = df['B'].str.split('>`').apply(lambda x: pd.Series(['']*(2-len(x)) + x))
df = df.drop('B', axis=1)
return df
def d(df):
df[['C','D']] = df['B'].str.split('>`', expand=True)
mask = pd.notnull(df['D'])
df['D'] = df['D'].fillna(df['C'])
df['C'] = np.where(mask, df['C'], '')
df = df.drop('B', axis=1)
return df
Вы можете сделать это довольно легко с помощью act-native-device-info , например:
import DeviceInfo from 'react-native-device-info'
isSimulator() {
return DeviceInfo.isEmulator();
},
Используя act-native-device-info , вы можете получить следующие данные (выполненные на симуляторе):
getUniqueID: DB71DCB5-6BB0-497B-BE9E-A02BCC1235B7
getInstanceID: undefined
getDeviceId: x86_64
getManufacturer: Apple
getModel: Simulator
getBrand: Apple
getSystemName: iOS
getSystemVersion: 10.1
getBundleId: org.reactjs.native.example.project
getBuildNumber: 1
getVersion: 1.0
getReadableVersion: 1.0.1
getDeviceName:MacBook Pro
getUserAgent: Mozilla/5.0 (iPhone; CPU iPhone OS 10_1 like Mac OS X) AppleWebKit/602.2.14 (KHTML, like Gecko) Mobile/14B72
getDeviceLocale: en
getDeviceCountry: US
getTimezone: America/Panama
isEmulator: true
isTablet: false
Самое простое решение, которое я могу придумать, которое не требует создания собственного модуля (или изменения существующего), состоит в том, чтобы передать этот параметр в качестве свойства реагирующего компонента.
В вашем AppDelegate
, где инициализируется RCTRootView
, вы проверяете, является ли это симулятором, как если бы вы делали это в обычном приложении для iOS; Затем вы передаете эту информацию в корневое представление реагирования в виде initialProperties
:
BOOL isSimulator = NO;
#if TARGET_IPHONE_SIMULATOR
isSimulator = YES;
#endif
RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation
moduleName:@"ReactDemo"
initialProperties:@{@"isSimulator": @(isSimulator)}
launchOptions:launchOptions];
Теперь вы можете получить к ней доступ в JavaScript через реквизиты вашего компонента реакции:
this.props.isSimulator
В Android у вас MainActivity
, который расширяет ReactActivity
, вы можете использовать аналогичный подход:
public boolean isEmulator() {
return Build.FINGERPRINT.startsWith("generic")
|| Build.FINGERPRINT.startsWith("unknown")
|| Build.MODEL.contains("google_sdk")
|| Build.MODEL.contains("Emulator")
|| Build.MODEL.contains("Android SDK built for x86")
|| Build.MANUFACTURER.contains("Genymotion")
|| (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
|| "google_sdk".equals(Build.PRODUCT);
}
@Override
protected Bundle getLaunchOptions() {
Bundle opts = new Bundle();
opts.putBoolean("isEmulator", isEmulator());
return opts;
}
Если вы создаете приложение CRNA / Expo, вы можете использовать Expo.Constants.isDevice
https://docs.expo.io/versions/latest/sdk/constants/#constantsisdevice
import { Constants } from 'expo'
//....
console.log(Constants.isDevice) // => false if simulator
В настоящее время нет никакого способа узнать, работаете ли вы с симулятора в JS.
Я бы предложил добавить условное TARGET_IPHONE_SIMULATOR
для проверки вашего нативного кода (если вы написали свой собственный модуль). Или, может быть, использовать сторонний модуль, который не рендерит камеру, если в симуляторе ... т.е. utf8 =% E2% 9C% 93 & амп; д = TARGET_IPHONE_SIMULATOR